Bug 30810 - [gdb/symtab, stabs] gdbtypes.c:5596: internal-error: Unexpected type field location kind: 6
Summary: [gdb/symtab, stabs] gdbtypes.c:5596: internal-error: Unexpected type field lo...
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: symtab (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: 14.1
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-08-30 06:56 UTC by Tom de Vries
Modified: 2023-08-31 07:39 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tom de Vries 2023-08-30 06:56:07 UTC
When running test-case gdb.dwarf2/per-bfd-sharing.exp with make-check-all.sh, I run into:
...
TARGET BOARD: stabs
ERROR: Could not resync from internal error (eof)
ERROR: GDB process no longer exists
FAIL: gdb.dwarf2/per-bfd-sharing.exp: first=index: second=readnow: third=index: load third: file index (GDB internal error)
FAIL: gdb.dwarf2/per-bfd-sharing.exp: first=index: second=readnow: third=readnow: load third: file readnow (GDB internal error)
FAIL: gdb.dwarf2/per-bfd-sharing.exp: first=index: second=readnow: third=standard: load third: file (GDB internal error)
# of expected passes		259
# of unexpected core files	6
# of unexpected failures	3
# of unresolved testcases	11
...

In more detail, using c++filt:
...
(gdb) file build/gdb/testsuite/outputs/gdb.dwarf2/per-bfd-sharing/per-bfd-sharing
Reading symbols from build/gdb/testsuite/outputs/gdb.dwarf2/per-bfd-sharing/per-bfd-sharing...


Fatal signal: Segmentation fault
----- Backtrace -----
0x59cca0 gdb_internal_backtrace_1
	gdb/bt-utils.c:122
0x59cd43 gdb_internal_backtrace()
	gdb/bt-utils.c:168
0x790ce0 handle_fatal_signal
	gdb/event-top.c:889
0x790e4c handle_sigsegv
	gdb/event-top.c:962
0x7f91519d890f ???
	/usr/src/debug/glibc-2.31-150300.52.2.x86_64/nptl/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
0x7f914f9cbdf7 __strlen_avx2
	../sysdeps/x86_64/multiarch/strlen-avx2.S:100
0x14844ac xstrdup
	libiberty/xstrdup.c:33
0x7efa63 copy_type_recursive(type*, htab*)
	gdb/gdbtypes.c:5572
0xd1c7c3 value::preserve(objfile*, htab*)
	gdb/value.c:2388
0xd1ca39 preserve_values(objfile*)
	gdb/value.c:2448
0x9940e2 objfile::~objfile()
	gdb/objfiles.c:532
0x997ad5 std::default_delete<objfile>::operator()(objfile*) const
	/usr/include/c++/7/bits/unique_ptr.h:78
0x9974d2 std::unique_ptr<objfile, std::default_delete<objfile> >::~unique_ptr()
	/usr/include/c++/7/bits/unique_ptr.h:263
0x9fccc3 void __gnu_cxx::new_allocator<std::_List_node<std::unique_ptr<objfile, std::default_delete<objfile> > > >::destroy<std::unique_ptr<objfile, std::default_delete<objfile> > >(std::unique_ptr<objfile, std::default_delete<objfile> >*)
	/usr/include/c++/7/ext/new_allocator.h:140
0x9fc682 void std::allocator_traits<std::allocator<std::_List_node<std::unique_ptr<objfile, std::default_delete<objfile> > > > >::destroy<std::unique_ptr<objfile, std::default_delete<objfile> > >(std::allocator<std::_List_node<std::unique_ptr<objfile, std::default_delete<objfile> > > >&, std::unique_ptr<objfile, std::default_delete<objfile> >*)
	/usr/include/c++/7/bits/alloc_traits.h:487
0x9fc269 std::__cxx11::list<std::unique_ptr<objfile, std::default_delete<objfile> >, std::allocator<std::unique_ptr<objfile, std::default_delete<objfile> > > >::_M_erase(std::_List_iterator<std::unique_ptr<objfile, std::default_delete<objfile> > >)
	/usr/include/c++/7/bits/stl_list.h:1815
0x9fbabd std::__cxx11::list<std::unique_ptr<objfile, std::default_delete<objfile> >, std::allocator<std::unique_ptr<objfile, std::default_delete<objfile> > > >::erase(std::_List_const_iterator<std::unique_ptr<objfile, std::default_delete<objfile> > >)
	/usr/include/c++/7/bits/list.tcc:157
0x9fa07d program_space::remove_objfile(objfile*)
	gdb/progspace.c:175
0x993f9f objfile::unlink()
	gdb/objfiles.c:470
0xbc8ab7 syms_from_objfile_1
	gdb/symfile.c:936
0xbc8c7b syms_from_objfile
	gdb/symfile.c:983
0xbc9176 symbol_file_add_with_addrs
	gdb/symfile.c:1086
0xbc9503 symbol_file_add_from_bfd(gdb::ref_ptr<bfd, gdb_bfd_ref_policy> const&, char const*, enum_flags<symfile_add_flag>, std::vector<other_sections, std::allocator<other_sections> >*, enum_flags<objfile_flag>, objfile*)
	gdb/symfile.c:1167
0xbc9552 symbol_file_add(char const*, enum_flags<symfile_add_flag>, std::vector<other_sections, std::allocator<other_sections> >*, enum_flags<objfile_flag>)
	gdb/symfile.c:1180
0xbc9617 symbol_file_add_main_1
	gdb/symfile.c:1203
0xbcab69 symbol_file_command(char const*, int)
	gdb/symfile.c:1681
0x793660 file_command
	gdb/exec.c:554
0x5f5856 do_simple_func
	gdb/cli/cli-decode.c:95
0x5fa86a cmd_func(cmd_list_element*, char const*, int)
	gdb/cli/cli-decode.c:2735
0xc3f91f execute_command(char const*, int)
	gdb/top.c:575
0x790499 command_handler(char const*)
	gdb/event-top.c:552
0x7909a1 command_line_handler(std::unique_ptr<char, gdb::xfree_deleter<char> >&&)
	gdb/event-top.c:788
0xc6be4f tui_command_line_handler
	gdb/tui/tui-interp.c:104
0x78fdef gdb_rl_callback_handler
	gdb/event-top.c:259
0xd79293 rl_callback_read_char
	readline/readline/callback.c:290
0x78fc57 gdb_rl_callback_read_char_wrapper_noexcept
	gdb/event-top.c:195
0x78fcf3 gdb_rl_callback_read_char_wrapper
	gdb/event-top.c:234
0xc95597 stdin_event_handler
	gdb/ui.c:155
0x149fe51 handle_file_event
	gdbsupport/event-loop.cc:573
0x14a03e7 gdb_wait_for_event
	gdbsupport/event-loop.cc:694
0x149f2ad gdb_do_one_event(int)
	gdbsupport/event-loop.cc:264
0x8f869e start_event_loop
	gdb/main.c:412
0x8f87f8 captured_command_loop
	gdb/main.c:476
0x8f9fe4 captured_main
	gdb/main.c:1320
0x8fa07e gdb_main(captured_main_args*)
	gdb/main.c:1339
0x415f52 main
	gdb/gdb.c:39
---------------------
A fatal error internal to GDB has been detected, further
debugging is not possible.  GDB will now terminate.

This is a bug, please report it.  For instructions, see:
<https://www.gnu.org/software/gdb/bugs/>.

ERROR: GDB process no longer exists
GDB process exited with wait status 3221 exp9 0 0 CHILDKILLED SIGSEGV {segmentation violation}
...

When running from the command line instead:
...
$ gdb -q -batch -x outputs/gdb.dwarf2/per-bfd-sharing/gdb.in.26
...
I get:
...
/data/vries/gdb/src/gdb/gdbtypes.c:5596: internal-error: Unexpected type field location kind: 6
A problem internal to GDB has been detected,
further debugging may prove unreliable.
----- Backtrace -----
0x59cca0 gdb_internal_backtrace_1
	/data/vries/gdb/src/gdb/bt-utils.c:122
0x59cd43 _Z22gdb_internal_backtracev
	/data/vries/gdb/src/gdb/bt-utils.c:168
0xce6b30 internal_vproblem
	/data/vries/gdb/src/gdb/utils.c:396
0xce6eff _Z15internal_verrorPKciS0_P13__va_list_tag
	/data/vries/gdb/src/gdb/utils.c:476
0x149ee84 _Z18internal_error_locPKciS0_z
	/data/vries/gdb/src/gdbsupport/errors.cc:58
0x7efc34 _Z19copy_type_recursiveP4typeP4htab
	/data/vries/gdb/src/gdb/gdbtypes.c:5595
...
Comment 1 Tom de Vries 2023-08-30 10:05:17 UTC
Tentative patch:
...
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index 832b689cf03..65ce3a0f5a8 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -267,7 +267,7 @@ buildsym_compunit::finish_block_internal
 	      ftype->set_num_fields (nparams);
 	      ftype->set_fields
 		((struct field *)
-		 TYPE_ALLOC (ftype, nparams * sizeof (struct field)));
+		 TYPE_ZALLOC (ftype, nparams * sizeof (struct field)));
 
 	      iparams = 0;
 	      /* Here we want to directly access the dictionary, because
...
Comment 3 Sourceware Commits 2023-08-31 07:37:57 UTC
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0b8b932dce26ef8e907b3b3c06b01a99420245fe

commit 0b8b932dce26ef8e907b3b3c06b01a99420245fe
Author: Tom de Vries <tdevries@suse.de>
Date:   Thu Aug 31 09:37:44 2023 +0200

    [gdb/symtab] Fix uninitialized memory in buildsym_compunit::finish_block_internal
    
    When running test-case gdb.dwarf2/per-bfd-sharing.exp with target board stabs,
    gdb either segfaults or asserts due to reading uninitialized memory, allocated
    here in buildsym_compunit::finish_block_internal:
    ...
                  ftype->set_fields
                    ((struct field *)
                     TYPE_ALLOC (ftype, nparams * sizeof (struct field)));
    ...
    
    Fix this by using TYPE_ZALLOC instead.
    
    Tested on x86_64-linux.
    
    Approved-By: Tom Tromey <tom@tromey.com>
    
    PR symtab/30810
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30810
Comment 4 Tom de Vries 2023-08-31 07:39:56 UTC
Fixed.