]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
gdb: fix 'maint info inline-frames' after 'stepi'
authorAndrew Burgess <aburgess@redhat.com>
Thu, 17 Oct 2024 10:56:47 +0000 (11:56 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Sun, 20 Oct 2024 20:54:13 +0000 (21:54 +0100)
commit48a0a7ca5e6f928bb707cb16aeae1ff8b678f101
treeaa91f018169d3f881ca64f540bc056da6fbf22aa
parent40ae603e6e0fe21fd0c1677dcf4e137cf99c2ebe
gdb: fix 'maint info inline-frames' after 'stepi'

There is an invalid assumption within 'maint info inline-frames' which
triggers an assert:

  (gdb) stepi
  0x000000000040119d 18   printf ("Hello World\n");
  (gdb) maintenance info inline-frames
  ../../src/gdb/inline-frame.c:554: internal-error: maintenance_info_inline_frames: Assertion `it != inline_states.end ()' failed.
  A problem internal to GDB has been detected,
  further debugging may prove unreliable.
  ----- Backtrace -----
  ... etc ...

The problem is this assert:

  /* Stopped threads always have cached inline_state information.  */
  gdb_assert (it != inline_states.end ());

If you check out infrun.c and look in handle_signal_stop for the call
to skip_inline_frames then you'll find a rather large comment that
explains that we don't always compute the inline state information for
performance reasons.  So the assertion is not valid.

I've updated the code so that if there is cached information we use
that, but if there is not then we just create our own information for
the current $pc of the current thread.

This means that, if there is cached information, GDB still correctly
shows which frame the inferior is in (it might not be in the inner
most frame).

If there is no cached information we will always display the inferior
as being in the inner most frame, but that's OK, because if
skip_inline_frames has not been called then GDB will have told the
user they are in the inner most frame, so everything lines up.

I've extended the test to check 'maint info inline-frames' after a
stepi which would previously have triggered the assertion.
gdb/inline-frame.c
gdb/testsuite/gdb.base/maint-info-inline-frames-and-blocks.exp