dwarf2 and frame bases

Daniel Jacobowitz drow@false.org
Wed Nov 10 23:58:00 GMT 2004


On Wed, Nov 10, 2004 at 03:51:49PM -0800, Randolph Chung wrote:
> The "recurse" test has been failing on hppa for a long time. I think I
> finally understand what is happening, but not sure of a fix....
> 
> the symptom of the problem is that watchpoints fail during recursion:
> 
> (gdb) watch b
> Watchpoint 2: b
> (gdb) continue
> Continuing.
> Watchpoint 2: b
> 
> Old value = 0
> New value = 10
> recurse (a=10) at ../../../gdb-cvs/gdb/testsuite/gdb.base/recurse.c:19
> 19        b *= recurse (a - 1);
> (gdb) continue
> Continuing.
> Error evaluating expression for watchpoint 2
> Cannot access memory at address 0x8
> Watchpoint 2 deleted.

>      DW_AT_frame_base  : 1 byte block: 53       (DW_OP_reg3)

> what seems to happen is that, to implement the watchpoint, we singlestep
> through the code and evaluate 'b' at every insn. If we do this in the
> prologue, we fail. The dwarf location expression handler tries to get
> the frame base by using DW_AT_frame_base, which points to register 3,
> but register 3 is not yet initialized in the prologue, so when we read
> it, we get garbage. argh...
> 
> I don't know enough about dwarf to know how this is supposed to be
> evaluated. Can someone please shed some light on this?

'b' is in some particular frame.  It's up the stack from the current
frame at the time of that error message, I get.  So we should be
unwinding reg3 and using the unwound copy to determine the value of b.
Is the unwinding breaking?

What's the actual PC at the time of the error?  Is it in the prologue? 
Epilogue?  What's the stack pointer - at the time of setting the
watchpoint, and at the time of the error?

-- 
Daniel Jacobowitz



More information about the Gdb mailing list