mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 10:34:21 +08:00
[gdb/symtab] Handle failure to open .gnu_debugaltlink file
If we instrument cc-with-tweaks.sh to remove the .gnu_debugaltlink file after dwz has created it, with test-case gdb.threads/access-mem-running-thread-exit.exp and target board cc-with-dwz-m we run into: ... (gdb) file access-mem-running-thread-exit^M Reading symbols from access-mem-running-thread-exit...^M could not find '.gnu_debugaltlink' file for access-mem-running-thread-exit^M ... followed a bit later by: ... (gdb) file access-mem-running-thread-exit^M Reading symbols from access-mem-running-thread-exit...^M gdb/dwarf2/read.c:7284: internal-error: create_all_units: \ Assertion `per_objfile->per_bfd->all_units.empty ()' failed.^M ... The problem is that create_units does not catch the error thrown by dwarf2_get_dwz_file. Fix this by catching the error and performing the necessary cleanup, getting the same result for the first and second file command. PR symtab/29805 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29805
This commit is contained in:
@ -7291,7 +7291,16 @@ create_all_units (dwarf2_per_objfile *per_objfile)
|
|||||||
&per_objfile->per_bfd->abbrev, 0,
|
&per_objfile->per_bfd->abbrev, 0,
|
||||||
types_htab, rcuh_kind::TYPE);
|
types_htab, rcuh_kind::TYPE);
|
||||||
|
|
||||||
dwz_file *dwz = dwarf2_get_dwz_file (per_objfile->per_bfd);
|
dwz_file *dwz;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dwz = dwarf2_get_dwz_file (per_objfile->per_bfd);
|
||||||
|
}
|
||||||
|
catch (const gdb_exception_error &)
|
||||||
|
{
|
||||||
|
per_objfile->per_bfd->all_units.clear ();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
if (dwz != NULL)
|
if (dwz != NULL)
|
||||||
{
|
{
|
||||||
/* Pre-read the sections we'll need to construct an index. */
|
/* Pre-read the sections we'll need to construct an index. */
|
||||||
|
48
gdb/testsuite/gdb.dwarf2/no-gnu-debuglink.exp
Normal file
48
gdb/testsuite/gdb.dwarf2/no-gnu-debuglink.exp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# Copyright 2022 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Check that loading a file with a broken .gnu_debugaltlink doesn't crash gdb.
|
||||||
|
|
||||||
|
load_lib dwarf.exp
|
||||||
|
|
||||||
|
# This test can only be run on targets which support DWARF-2 and use gas.
|
||||||
|
if {![dwarf2_support]} {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# No remote host testing either.
|
||||||
|
if {[is_remote host]} {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
standard_testfile main.c no-gnu-debuglink.S
|
||||||
|
|
||||||
|
set asm_file [standard_output_file $srcfile2]
|
||||||
|
|
||||||
|
Dwarf::assemble $asm_file {
|
||||||
|
gnu_debugaltlink "file-not-here" "0000000000000000000000000000000000000000"
|
||||||
|
}
|
||||||
|
|
||||||
|
if { [build_executable $testfile.exp $testfile [list $srcfile $asm_file]] } {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
clean_restart
|
||||||
|
|
||||||
|
set msg "\r\ncould not find '\.gnu_debugaltlink' file for \[^\r\n\]*"
|
||||||
|
gdb_test "file $binfile" "$msg" "file command"
|
||||||
|
|
||||||
|
set question "Load new symbol table from .*\? .y or n. "
|
||||||
|
gdb_test "file $binfile" "$msg" "file command, again" $question "y"
|
Reference in New Issue
Block a user