Allow debugging of runtime loader / dynamic linker
authorKevin Buettner <kevinb@redhat.com>
Thu, 20 Oct 2022 02:36:07 +0000 (19:36 -0700)
committerKevin Buettner <kevinb@redhat.com>
Thu, 20 Oct 2022 02:40:33 +0000 (19:40 -0700)
At present, GDB does not allow for the debugging of the runtime loader
and/or dynamic linker.  Much of the time, this makes sense.  An
application programmer doesn't normally want to see symbol resolution
code when stepping into a function that hasn't been resolved yet.

But someone who wishes to debug the runtime loader / dynamic linker
might place a breakpoint in that code and then wish to debug it
as normal.  At the moment, this is not possible.  Attempting to step
will cause GDB to internally step (and not stop) until code
unrelated to the dynamic linker is reached.

This commit makes a minor change to infrun.c which allows the dynamic
loader / linker to be debugged in the case where a step, next, etc.
is initiated from within that code.

While developing this fix, I tried some approaches which weren't quite
right.  The GDB testusite definitely contains tests which FAIL when
it's done incorrectly.  (At one point, I saw 17 regressions!) This
commit has been tested on x86-64 linux with no regressions.

gdb/infrun.c

index 2e462be5ba7033c4936bec8b181068c7dae8226b..9a9f42fc903def3641a55b1a0b2d41698f0c1c96 100644 (file)
@@ -6955,7 +6955,10 @@ process_event_stop_test (struct execution_control_state *ecs)
 
   if (execution_direction != EXEC_REVERSE
       && ecs->event_thread->control.step_over_calls == STEP_OVER_UNDEBUGGABLE
-      && in_solib_dynsym_resolve_code (ecs->event_thread->stop_pc ()))
+      && in_solib_dynsym_resolve_code (ecs->event_thread->stop_pc ())
+      && !in_solib_dynsym_resolve_code (
+         ecs->event_thread->control.step_start_function->value_block ()
+             ->entry_pc ()))
     {
       CORE_ADDR pc_after_resolver =
        gdbarch_skip_solib_resolver (gdbarch, ecs->event_thread->stop_pc ());