- Patch added (bsc#1250033, swo#33480): * gdb-c-fix-hang-on-whatis-std-string-npos.patch - Patch added (swo#33512): * gdb-fix-assertion-failure-due-to-null-frame.patch
235 lines
9.2 KiB
Diff
235 lines
9.2 KiB
Diff
From 76cd53ac04d28670ee1fd970d3e37d7006192a9c Mon Sep 17 00:00:00 2001
|
|
From: Tom de Vries <tdevries@suse.de>
|
|
Date: Sat, 4 Oct 2025 02:07:16 +0200
|
|
Subject: [PATCH] [gdb] Fix assertion failure due to null frame
|
|
|
|
PR gdb/33512 reports an assertion failure in test-case
|
|
gdb.ada/access_to_packed_array.exp on i386-linux:
|
|
...
|
|
(gdb) maint print symbols
|
|
gdb/frame.c:3400: internal-error: reinflate: \
|
|
Assertion `m_cached_level >= -1' failed.
|
|
A problem internal to GDB has been detected,
|
|
further debugging may prove unreliable.
|
|
Quit this debugging session? (y or n) FAIL: $exp: \
|
|
maint print symbols (GDB internal error)
|
|
...
|
|
|
|
I haven't been able to reproduce the failure by running the test-case on
|
|
x86_64-linux with target board unix/-m32, but I'm able to reproduce on
|
|
x86_64-linux by using the exec attached to the PR:
|
|
...
|
|
$ cat gdb.in
|
|
file foo
|
|
maint expand-symtabs
|
|
maint print symbols
|
|
$ gdb -q -batch -ex "set trace-commands on" -x gdb.in
|
|
...
|
|
c_to: array (gdb/frame.c:3395: internal-error: reinflate: \
|
|
Assertion `m_cached_level >= -1' failed.
|
|
...
|
|
|
|
The problem happens when trying to print variable c_to:
|
|
...
|
|
<4><f227>: Abbrev Number: 3 (DW_TAG_variable)
|
|
<f228> DW_AT_name : c_to
|
|
<f230> DW_AT_type : <0xf214>
|
|
...
|
|
with type:
|
|
...
|
|
<4><f214>: Abbrev Number: 7 (DW_TAG_array_type)
|
|
<f215> DW_AT_type : <0x9f39>
|
|
<5><f21d>: Abbrev Number: 12 (DW_TAG_subrange_type)
|
|
<f21e> DW_AT_type : <0x9d6c>
|
|
<f222> DW_AT_upper_bound : <0xf209>
|
|
...
|
|
with upper bound:
|
|
...
|
|
<4><f209>: Abbrev Number: 89 (DW_TAG_variable)
|
|
<f20a> DW_AT_name : system__os_lib__copy_file__copy_to__TTc_toSP1___U
|
|
<f20e> DW_AT_type : <0x9d6c>
|
|
<f212> DW_AT_artificial : 1
|
|
<f212> DW_AT_location : 1 byte block: 57 (DW_OP_reg7 (edi))
|
|
...
|
|
|
|
The backtrace at the point of the assertion failure is:
|
|
...
|
|
(gdb) bt
|
|
#0 __pthread_kill_implementation (threadid=<optimized out>,
|
|
signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
|
|
#1 0x00007ffff62a8e7f in __pthread_kill_internal (signo=6,
|
|
threadid=<optimized out>) at pthread_kill.c:78
|
|
#2 0x00007ffff6257842 in __GI_raise (sig=sig@entry=6)
|
|
at ../sysdeps/posix/raise.c:26
|
|
#3 0x00007ffff623f5cf in __GI_abort () at abort.c:79
|
|
#4 0x00000000010e7ac6 in dump_core () at gdb/utils.c:223
|
|
#5 0x00000000010e81b8 in internal_vproblem(internal_problem *, const char *, int, const char *, typedef __va_list_tag __va_list_tag *) (
|
|
problem=0x2ceb0c0 <internal_error_problem>,
|
|
file=0x1ad5a90 "gdb/frame.c", line=3395,
|
|
fmt=0x1ad5a08 "%s: Assertion `%s' failed.", ap=0x7fffffffc3c0)
|
|
at gdb/utils.c:475
|
|
#6 0x00000000010e82ac in internal_verror (
|
|
file=0x1ad5a90 "gdb/frame.c", line=3395,
|
|
fmt=0x1ad5a08 "%s: Assertion `%s' failed.", ap=0x7fffffffc3c0)
|
|
at gdb/utils.c:501
|
|
#7 0x00000000019be79f in internal_error_loc (
|
|
file=0x1ad5a90 "gdb/frame.c", line=3395,
|
|
fmt=0x1ad5a08 "%s: Assertion `%s' failed.")
|
|
at gdbsupport/errors.cc:57
|
|
#8 0x00000000009b5c16 in frame_info_ptr::reinflate (this=0x7fffffffc878)
|
|
at gdb/frame.c:3395
|
|
#9 0x00000000009b66f9 in frame_info_ptr::operator-> (this=0x7fffffffc878)
|
|
at gdb/frame.h:290
|
|
#10 0x00000000009b4bd5 in get_frame_arch (this_frame=...)
|
|
at gdb/frame.c:3075
|
|
#11 0x000000000081dd89 in dwarf_expr_context::fetch_result (
|
|
this=0x7fffffffc810, type=0x410d600, subobj_type=0x410d600,
|
|
subobj_offset=0, as_lval=true)
|
|
at gdb/dwarf2/expr.c:1006
|
|
#12 0x000000000081e2ef in dwarf_expr_context::evaluate (this=0x7fffffffc810,
|
|
addr=0x7ffff459ce6b "W\aF\003", len=1, as_lval=true,
|
|
per_cu=0x7fffd00053f0, frame=..., addr_info=0x7fffffffcc30, type=0x0,
|
|
subobj_type=0x0, subobj_offset=0)
|
|
at gdb/dwarf2/expr.c:1136
|
|
#13 0x0000000000877c14 in dwarf2_locexpr_baton_eval (dlbaton=0x3e99c18,
|
|
frame=..., addr_stack=0x7fffffffcc30, valp=0x7fffffffcab0,
|
|
push_values=..., is_reference=0x7fffffffc9b0)
|
|
at gdb/dwarf2/loc.c:1604
|
|
#14 0x0000000000877f71 in dwarf2_evaluate_property (prop=0x3e99ce0,
|
|
initial_frame=..., addr_stack=0x7fffffffcc30, value=0x7fffffffcab0,
|
|
push_values=...) at gdb/dwarf2/loc.c:1668
|
|
#15 0x00000000009def76 in resolve_dynamic_range (dyn_range_type=0x3e99c50,
|
|
addr_stack=0x7fffffffcc30, frame=..., rank=0, resolve_p=true)
|
|
at gdb/gdbtypes.c:2198
|
|
#16 0x00000000009e0ded in resolve_dynamic_type_internal (type=0x3e99c50,
|
|
addr_stack=0x7fffffffcc30, frame=..., top_level=true)
|
|
at gdb/gdbtypes.c:2934
|
|
#17 0x00000000009e1079 in resolve_dynamic_type (type=0x3e99c50, valaddr=...,
|
|
addr=0, in_frame=0x0) at gdb/gdbtypes.c:2989
|
|
#18 0x0000000000488ebc in ada_discrete_type_low_bound (type=0x3e99c50)
|
|
at gdb/ada-lang.c:710
|
|
#19 0x00000000004eb734 in print_range (type=0x3e99c50, stream=0x30157b0,
|
|
bounds_preferred_p=0) at gdb/ada-typeprint.c:156
|
|
#20 0x00000000004ebffe in print_array_type (type=0x3e99d10, stream=0x30157b0,
|
|
show=1, level=9, flags=0x1bdcf20 <type_print_raw_options>)
|
|
at gdb/ada-typeprint.c:381
|
|
#21 0x00000000004eda3c in ada_print_type (type0=0x3e99d10,
|
|
varstring=0x401f710 "c_to", stream=0x30157b0, show=1, level=9,
|
|
flags=0x1bdcf20 <type_print_raw_options>)
|
|
at gdb/ada-typeprint.c:1015
|
|
#22 0x00000000004b4627 in ada_language::print_type (
|
|
this=0x2f949b0 <ada_language_defn>, type=0x3e99d10,
|
|
varstring=0x401f710 "c_to", stream=0x30157b0, show=1, level=9,
|
|
flags=0x1bdcf20 <type_print_raw_options>)
|
|
at gdb/ada-lang.c:13681
|
|
#23 0x0000000000f74646 in print_symbol (gdbarch=0x3256270, symbol=0x3e99db0,
|
|
depth=9, outfile=0x30157b0) at gdb/symmisc.c:545
|
|
#24 0x0000000000f737e6 in dump_symtab_1 (symtab=0x3ddd7e0, outfile=0x30157b0)
|
|
at gdb/symmisc.c:313
|
|
#25 0x0000000000f73a69 in dump_symtab (symtab=0x3ddd7e0, outfile=0x30157b0)
|
|
at gdb/symmisc.c:370
|
|
#26 0x0000000000f7420f in maintenance_print_symbols (args=0x0, from_tty=0)
|
|
at gdb/symmisc.c:481
|
|
#27 0x00000000006c7fde in do_simple_func (args=0x0, from_tty=0, c=0x321e270)
|
|
at gdb/cli/cli-decode.c:94
|
|
#28 0x00000000006ce65a in cmd_func (cmd=0x321e270, args=0x0, from_tty=0)
|
|
at gdb/cli/cli-decode.c:2826
|
|
#29 0x0000000001005b78 in execute_command (p=0x3f48fe3 "", from_tty=0)
|
|
at gdb/top.c:564
|
|
#30 0x0000000000966095 in command_handler (
|
|
command=0x3f48fd0 "maint print symbols")
|
|
at gdb/event-top.c:613
|
|
#31 0x0000000001005141 in read_command_file (stream=0x3011a40)
|
|
at gdb/top.c:333
|
|
#32 0x00000000006e2a64 in script_from_file (stream=0x3011a40,
|
|
file=0x7fffffffe21f "gdb.in")
|
|
at gdb/cli/cli-script.c:1705
|
|
#33 0x00000000006bb88c in source_script_from_stream (stream=0x3011a40,
|
|
file=0x7fffffffe21f "gdb.in", file_to_open=0x7fffffffd760 "gdb.in")
|
|
at gdb/cli/cli-cmds.c:706
|
|
#34 0x00000000006bba12 in source_script_with_search (
|
|
file=0x7fffffffe21f "gdb.in", from_tty=0, search_path=0)
|
|
at gdb/cli/cli-cmds.c:751
|
|
#35 0x00000000006bbab2 in source_script (file=0x7fffffffe21f "gdb.in",
|
|
from_tty=0) at gdb/cli/cli-cmds.c:760
|
|
#36 0x0000000000b835cb in catch_command_errors (
|
|
command=0x6bba7e <source_script(char const*, int)>,
|
|
arg=0x7fffffffe21f "gdb.in", from_tty=0, do_bp_actions=false)
|
|
at gdb/main.c:510
|
|
#37 0x0000000000b83803 in execute_cmdargs (cmdarg_vec=0x7fffffffd980,
|
|
file_type=CMDARG_FILE, cmd_type=CMDARG_COMMAND, ret=0x7fffffffd8c8)
|
|
at gdb/main.c:606
|
|
#38 0x0000000000b84d79 in captured_main_1 (context=0x7fffffffdb90)
|
|
at gdb/main.c:1349
|
|
#39 0x0000000000b84fe4 in captured_main (context=0x7fffffffdb90)
|
|
at gdb/main.c:1372
|
|
#40 0x0000000000b85092 in gdb_main (args=0x7fffffffdb90)
|
|
at gdb/main.c:1401
|
|
#41 0x000000000041a382 in main (argc=9, argv=0x7fffffffdcc8)
|
|
at gdb/gdb.c:38
|
|
(gdb)
|
|
...
|
|
|
|
The immediate problem is in dwarf_expr_context::fetch_result where we're
|
|
calling get_frame_arch:
|
|
...
|
|
switch (this->m_location)
|
|
{
|
|
case DWARF_VALUE_REGISTER:
|
|
{
|
|
gdbarch *f_arch = get_frame_arch (this->m_frame);
|
|
...
|
|
with a null frame:
|
|
...
|
|
(gdb) p this->m_frame.is_null ()
|
|
$1 = true
|
|
(gdb)
|
|
...
|
|
|
|
Fix this using ensure_have_frame in dwarf_expr_context::execute_stack_op for
|
|
DW_OP_reg<n> and DW_OP_regx, getting us instead:
|
|
...
|
|
c_to: array (<>) of character; computed at runtime
|
|
...
|
|
|
|
Tested on x86_64-linux.
|
|
|
|
Approved-By: Tom Tromey <tom@tromey.com>
|
|
|
|
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33512
|
|
---
|
|
gdb/dwarf2/expr.c | 8 ++++++++
|
|
1 file changed, 8 insertions(+)
|
|
|
|
diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c
|
|
index ee1522b7437..c532ca90d12 100644
|
|
--- a/gdb/dwarf2/expr.c
|
|
+++ b/gdb/dwarf2/expr.c
|
|
@@ -1710,6 +1710,10 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
|
|
case DW_OP_reg29:
|
|
case DW_OP_reg30:
|
|
case DW_OP_reg31:
|
|
+ /* The value of a register is relative to a frame, so we require a
|
|
+ valid frame. */
|
|
+ ensure_have_frame (this->m_frame, "DW_OP_reg<n>");
|
|
+
|
|
dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_reg");
|
|
|
|
result = op - DW_OP_reg0;
|
|
@@ -1718,6 +1722,10 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
|
|
break;
|
|
|
|
case DW_OP_regx:
|
|
+ /* The value of a register is relative to a frame, so we require a
|
|
+ valid frame. */
|
|
+ ensure_have_frame (this->m_frame, "DW_OP_regx");
|
|
+
|
|
op_ptr = safe_read_uleb128 (op_ptr, op_end, ®);
|
|
dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
|
|
|
|
|
|
base-commit: 0234020f718829f13f2645d5057b51ebcbbff151
|
|
--
|
|
2.51.0
|
|
|