mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-09 05:10:23 +00:00
This commit subtly changes the meaning of the values obtained via the
stack unwind mechanism (the function VG_(record_ExeContext) et al), clears up some associated kludges, and makes suppression matching work more reliably. Prior to this commit, a stack snapshot contained, at [0], the IP of the relevant thread, and at all positions [1] and above, the return addresses for the open calls. When showing a snapshot to the user (in VG_(apply_StackTrace)), and searching the stack for stack blocks (in VG_(get_data_description)), 1 is subtracted from positions [1] and above, so as to move these return addresses back to the last byte of the calling instruction. This subtraction is also done even in VG_(get_StackTrace_wrk) itself, in order to make the stack unwinding work at all. It turns out that suppression-vs-function-name matching requires the same hack, and sometimes failed to match suppressions that should match, because of this self-same problem. So the commit changes the stack unwinder itself, so that entries [1] and above point to the last byte of the call instruction, rather than the return address. The associated kludges in VG_(apply_StackTrace) and VG_(get_StackTrace_wrk) are removed, and suppression matching is observed to work in a case where it failed before. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8818
This commit is contained in:
@@ -41,6 +41,18 @@ typedef Addr* StackTrace;
|
||||
// The initial IP value to use is adjusted by first_ip_delta before
|
||||
// the stack is unwound. A safe value to pass is zero.
|
||||
//
|
||||
// The specific meaning of the returned addresses is:
|
||||
//
|
||||
// [0] is the IP of thread 'tid'
|
||||
// [1] points to the last byte of the call instruction that called [0].
|
||||
// [2] points to the last byte of the call instruction that called [1].
|
||||
// etc etc
|
||||
//
|
||||
// Hence ips[0 .. return_value-1] should all point to currently
|
||||
// 'active' (in the sense of a stack of unfinished function calls)
|
||||
// instructions. [0] points to the start of an arbitrary instruction.#
|
||||
// [1 ..] point to the last byte of a chain of call instructions.
|
||||
//
|
||||
// If sps and fps are non-NULL, the corresponding frame-pointer and
|
||||
// stack-pointer values for each frame are stored there.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user