mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-01 13:26:47 +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:
parent
14ae285f34
commit
05ad0d6034
@ -7291,7 +7291,16 @@ create_all_units (dwarf2_per_objfile *per_objfile)
|
||||
&per_objfile->per_bfd->abbrev, 0,
|
||||
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)
|
||||
{
|
||||
/* 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"
|
Loading…
Reference in New Issue
Block a user