This is the mail archive of the gdb-cvs@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]

src/gdb ChangeLog dwarf2-frame.c testsuite/Cha ...


CVSROOT:	/cvs/src
Module name:	src
Changes by:	brobecke@sourceware.org	2012-08-16 15:45:46

Modified files:
	gdb            : ChangeLog dwarf2-frame.c 
	gdb/testsuite  : ChangeLog 
Added files:
	gdb/testsuite/gdb.ada: rdv_wait.exp 
	gdb/testsuite/gdb.ada/rdv_wait: foo.adb pck.adb pck.ads 

Log message:
	DWARF frame unwinder executes one too many rows
	
	The problem is trying to unwind from a function where %ebp is NOT
	used as the frame pointer, and the size of the frame changes over
	the lifetime of that function.
	
	For instance, trying to unwind past the GNAT runtime function
	called system.tasking.rendezvous.timed_selective_wait on x86-linux,
	one can get:
	
	(gdb) bt
	[...]
	#3  0x0805364b in system.tasking.rendezvous.timed_selective_wait ()
	#4  0xb7fe5068 in ?? ()
	Backtrace stopped: previous frame inner to this frame (corrupt stack?)
	
	Looking at the CFI, we find the following initial instructions...
	
	>   DW_CFA_def_cfa: %esp+4 (r4 ofs 4)
	>   DW_CFA_offset: %eip at cfa-4  (r8 = %eip)
	
	... and the associated FDE:
	
	> 00001be4 00000054 00001be8 FDE cie=00000000 pc=08053310..08053951
	[...]
	>   DW_CFA_advance_loc: 8 to 080534ad
	>   DW_CFA_def_cfa_offset: 112
	>   DW_CFA_advance_loc2: 414 to 0805364b
	>   DW_CFA_def_cfa_offset: 108
	[...]
	
	The problem is that the DWARF frame unwinder executed the FDE until
	the row for PC == 0x0805364b. But in reality, our program hasn't
	executed the instruction at that address yet (it is the return address).
	So GDB executed a little too much of the FDE, giving us the wrong
	offset for the frame base, and thus the wrong address where %eip
	got saved.
	
	This patch fixes the problem by using a more correct PC as the bound
	for executing the FDE.
	
	gdb/ChangeLog:
	
	* dwarf2-frame.c (dwarf2_frame_cache): Use
	get_frame_address_in_block instead of get_frame_pc as
	the bound for executing the frame's FDE.
	
	gdb/testsuite/ChangeLog:
	
	* gdb.ada/rdv_wait: New testcase.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.14594&r2=1.14595
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/dwarf2-frame.c.diff?cvsroot=src&r1=1.139&r2=1.140
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&r1=1.3338&r2=1.3339
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.ada/rdv_wait.exp.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.ada/rdv_wait/foo.adb.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.ada/rdv_wait/pck.adb.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.ada/rdv_wait/pck.ads.diff?cvsroot=src&r1=NONE&r2=1.1


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