This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[rfc] Fix "step" for ld.so debugging [Re: [RFC] problem in solib-svr4/enable_break]


Hi Michael,

I see there is a problem for debugging ld.so even on native GNU/Linux when
I get some intentional way into the ld.so code.  Existing problem:
(gdb) frame
#0  _dl_fixup (l=0x7ffff7ffe0e8, reloc_arg=<value optimized out>) at ../elf/dl-runtime.c:90
90	  if (__builtin_expect (ELFW(ST_VISIBILITY) (sym->st_other), 0) == 0)
(gdb) next
94	      if (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
(gdb) next
99		  version = &l->l_versions[ndx];
(gdb) next
100		  if (version->hash == 0)
(gdb) step
pause () at ../sysdeps/unix/syscall-template.S:82
82	T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)

("next" works but "step" skips whole ld.so resolver)

Wouldn't the patch below also solve your "PIE kernel" problem?

No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
But I am not much sure about some possible regressions with this code.


Regards,
Jan


2010-01-15  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* infrun.c (handle_inferior_event): Continue stepping through dynsym
	resolve code only if STEP_RANGE_START was not in dynsym resolve code.

--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -4115,8 +4115,9 @@ infrun: not switching back to stepped thread, it has vanished\n");
   /* If we are stepping at the source level and entered the runtime
      loader dynamic symbol resolution code...
 
-     EXEC_FORWARD: we keep on single stepping until we exit the run
-     time loader code and reach the callee's address.
+     EXEC_FORWARD: we keep on single stepping until we exit the run time loader
+     code and reach the callee's address.  Permit normal stepping inside loader
+     code if user already started the stepping there.
 
      EXEC_REVERSE: we've already executed the callee (backward), and
      the runtime loader code is handled just like any other
@@ -4126,7 +4127,9 @@ infrun: not switching back to stepped thread, it has vanished\n");
 
   if (execution_direction != EXEC_REVERSE
       && ecs->event_thread->step_over_calls == STEP_OVER_UNDEBUGGABLE
-      && in_solib_dynsym_resolve_code (stop_pc))
+      && in_solib_dynsym_resolve_code (stop_pc)
+      && !(ecs->event_thread->step_range_start > 1
+	 && in_solib_dynsym_resolve_code (ecs->event_thread->step_range_start)))
     {
       CORE_ADDR pc_after_resolver =
 	gdbarch_skip_solib_resolver (gdbarch, stop_pc);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]