This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [hpux] Improve sigtramp frame identification
> Date: Sun, 11 Dec 2005 22:39:12 +0800
> From: Randolph Chung <randolph@tausq.org>
>
> > Hmm, here's an alternative approach: if we're in an export stub, look
> > if the stub leads us to a function that has HP_UX_interrupt_marker set
> > in its unwind record. This makes us read an instruction from the
> > inferior, but it should be pretty robust.
> >
> > ok?
>
> Hrm, this seems to assume that you are sitting at a specific insn of the
> export stub when doing unwinding. We should be able to unwind from any
> insn in the export stub, right?
Uh, yes, you're right. The attached patch works indeed better. That
bit ok now?
> > Now that signal trampolines get detected again on HP-UX 10.20, I
> > noticed another recent change that seems to have broken things. Your
> > recent overhaul of hppa_hpux_sigtramp_frame_unwind_cache added these
> > two lines:
> >
> > info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].addr =
> > info->saved_regs[HPPA_RP_REGNUM].addr;
> >
> > This breaks stuff, since at least on HP-UX 10.20 %pcoqh as read from
> > the signal state is correct. And I have a hard time believing that
> > this would be different on HP-UX 11.xx. Can you explain why you added
> > this?
>
> You are right, I shouldn't have added that. I thought this fixed a
> problem with signal frame unwinding when I was looking at
> hppa64-hp-hpux11.11, but actually I think something else is broken.
> Sorry for not testing this more thoroughly before committing. I'll back
> out that change tomorrow.
Thanks!
Mark
Index: hppa-hpux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/hppa-hpux-tdep.c,v
retrieving revision 1.45
diff -u -p -r1.45 hppa-hpux-tdep.c
--- hppa-hpux-tdep.c 19 Nov 2005 12:55:55 -0000 1.45
+++ hppa-hpux-tdep.c 11 Dec 2005 19:14:14 -0000
@@ -1233,9 +1233,6 @@ hppa_hpux_sigtramp_frame_unwind_cache (s
/* TODO: fp regs */
- info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].addr =
- info->saved_regs[HPPA_RP_REGNUM].addr;
-
info->base = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
return info;
@@ -1279,6 +1276,22 @@ hppa_hpux_sigtramp_unwind_sniffer (struc
u = find_unwind_entry (pc);
+ /* If this is an export stub, try to get the unwind descriptor for
+ the actual function itself. */
+ if (u && u->stub_unwind.stub_type == EXPORT)
+ {
+ gdb_byte buf[HPPA_INSN_SIZE];
+ unsigned long insn;
+
+ if (!safe_frame_unwind_memory (next_frame, u->region_start,
+ buf, sizeof buf))
+ return NULL;
+
+ insn = extract_unsigned_integer (buf, sizeof buf);
+ if ((insn & 0xffe0e000) == 0xe8400000)
+ u = find_unwind_entry(u->region_start + hppa_extract_17 (insn) + 8);
+ }
+
if (u && u->HP_UX_interrupt_marker)
return &hppa_hpux_sigtramp_frame_unwind;