[1/2] Allow debugging of runtime loader / dynamic linker

Message ID 20221008035716.46147-2-kevinb@redhat.com
State Committed
Commit be6276e0aed1f2df8f771d9823b6c8fea29e6a66
Headers
Series Allow debugging of runtime loader / dynamic linker |

Commit Message

Kevin Buettner Oct. 8, 2022, 3:57 a.m. UTC
  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 | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
  

Comments

Lancelot SIX Nov. 3, 2022, 3:52 p.m. UTC | #1
Hi Kevin,

We have recently encountered a bug with the master branch.  Simon have
opened https://sourceware.org/bugzilla/show_bug.cgi?id=29747 to track
it.

By running `git bisect`, it seems that this problem appeared with this
patch.

Do you think you would have time to investigate this issue?  I have not
looked at the actual problem yet.  I have just been looking at when the
regression got introduced.

I do not expect it to be too long to fix, but I am not familiar with
this part of the code.

Please let me know if you do not have time to investigate this.

Best,
Lancelot.

On Fri, Oct 07, 2022 at 08:57:15PM -0700, Kevin Buettner via Gdb-patches wrote:
> 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 | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/gdb/infrun.c b/gdb/infrun.c
> index 1957e8020dd..52441b7ab5c 100644
> --- a/gdb/infrun.c
> +++ b/gdb/infrun.c
> @@ -6961,7 +6961,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 ());
> -- 
> 2.37.3
>
  

Patch

diff --git a/gdb/infrun.c b/gdb/infrun.c
index 1957e8020dd..52441b7ab5c 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -6961,7 +6961,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 ());