dwarf-frame.c question

Michal Ludvig mludvig@suse.cz
Tue May 27 15:19:00 GMT 2003


Hi Mark,
why do you decrement unwound PC in dwarf_frame_cache() before using it?

dwarf-frame.c:
478       /* Unwind the PC.  */
479       fs->pc = frame_pc_unwind (next_frame);
480       if (get_frame_type (next_frame) == NORMAL_FRAME
481           && frame_relative_level (next_frame) >= 0)
482         fs->pc--;

This makes a problem for a signal trampoline.
If it is sitting on addresses say 0x40000140-0x40000150, the return 
address from signal handler is 0x40000140, but dwarf_frame_cache() says 
it is 0x4000013f and couldn't find it's CFI...

This has a tragic consequence few lines below were you look for FDE but 
don't check if you find one. If you don't, line 488 segfaults.
484       /* Find the correct FDE.  */
485       fde = dwarf_frame_find_fde (&fs->pc);
486
487       /* Extract any interesting information from the CIE.  */
488       fs->data_align = fde->cie->data_alignment_factor;
489       fs->code_align = fde->cie->code_alignment_factor;
490       fs->retaddr_column = fde->cie->return_address_register;

The problem is, that dwarf_frame_p() looks for the real return address 
and says that there is a debug info and sets unwinder to use dwarf2 
methods for this farme.
But the in unwinder itself in dwarf_frame_cache() looks for the 
decreased one and of course doesn't find it.

I couldn't see any problems when I removed the decrementation, so why is 
it there?

Michal Ludvig
-- 
* SuSE CR, s.r.o     * mludvig@suse.cz
* (+420) 296.545.373 * http://www.suse.cz



More information about the Gdb mailing list