This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[rfc] Fix "step" for ld.so debugging [Re: [RFC] problem in solib-svr4/enable_break]
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Michael Snyder <msnyder at vmware dot com>
- Cc: "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>
- Date: Fri, 15 Jan 2010 01:44:05 +0100
- Subject: [rfc] Fix "step" for ld.so debugging [Re: [RFC] problem in solib-svr4/enable_break]
- References: <4B4F95C3.5080209@vmware.com>
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);