mirror of
https://git.suyu.dev/suyu/breakpad.git
synced 2025-12-26 01:05:07 +01:00
Print the correct return address, even on architectures where StackFrame::instruction is offset.
a=bruce.dawson, r=jimblandy git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1105 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
d2153d7589
commit
be81ededf8
7 changed files with 72 additions and 35 deletions
|
|
@ -83,11 +83,31 @@ struct StackFrame {
|
|||
}
|
||||
};
|
||||
|
||||
// The program counter location as an absolute virtual address. For the
|
||||
// innermost called frame in a stack, this will be an exact program counter
|
||||
// or instruction pointer value. For all other frames, this will be within
|
||||
// the instruction that caused execution to branch to a called function,
|
||||
// but may not necessarily point to the exact beginning of that instruction.
|
||||
// Return the actual return address, as saved on the stack or in a
|
||||
// register. See the comments for 'instruction', below, for details.
|
||||
virtual u_int64_t ReturnAddress() const { return instruction; }
|
||||
|
||||
// The program counter location as an absolute virtual address.
|
||||
//
|
||||
// - For the innermost called frame in a stack, this will be an exact
|
||||
// program counter or instruction pointer value.
|
||||
//
|
||||
// - For all other frames, this address is within the instruction that
|
||||
// caused execution to branch to this frame's callee (although it may
|
||||
// not point to the exact beginning of that instruction). This ensures
|
||||
// that, when we look up the source code location for this frame, we
|
||||
// get the source location of the call, not of the point at which
|
||||
// control will resume when the call returns, which may be on the next
|
||||
// line. (If the compiler knows the callee never returns, it may even
|
||||
// place the call instruction at the very end of the caller's machine
|
||||
// code, such that the "return address" (which will never be used)
|
||||
// immediately after the call instruction is in an entirely different
|
||||
// function, perhaps even from a different source file.)
|
||||
//
|
||||
// On some architectures, the return address as saved on the stack or in
|
||||
// a register is fine for looking up the point of the call. On others, it
|
||||
// requires adjustment. ReturnAddress returns the address as saved by the
|
||||
// machine.
|
||||
u_int64_t instruction;
|
||||
|
||||
// The module in which the instruction resides.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue