mirror of
https://git.suyu.dev/suyu/breakpad.git
synced 2025-12-27 01:35:06 +01:00
Refactor some bits of StackWalkerX86 / StackFrameX86 out into their respective parent classes so they can be used by other architecture implementations.
R=jimb at http://breakpad.appspot.com/205001/show git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@703 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
de2c055770
commit
8c33b3e9c9
13 changed files with 118 additions and 113 deletions
|
|
@ -40,6 +40,19 @@ class CodeModule;
|
|||
using std::string;
|
||||
|
||||
struct StackFrame {
|
||||
// Indicates how well the instruction pointer derived during
|
||||
// stack walking is trusted. Since the stack walker can resort to
|
||||
// stack scanning, it can wind up with dubious frames.
|
||||
// In rough order of "trust metric".
|
||||
enum FrameTrust {
|
||||
FRAME_TRUST_NONE, // Unknown
|
||||
FRAME_TRUST_SCAN, // Scanned the stack, found this
|
||||
FRAME_TRUST_CFI_SCAN, // Scanned the stack using call frame info, found this
|
||||
FRAME_TRUST_FP, // Derived from frame pointer
|
||||
FRAME_TRUST_CFI, // Derived from call frame info
|
||||
FRAME_TRUST_CONTEXT // Given as instruction pointer in a context
|
||||
};
|
||||
|
||||
StackFrame()
|
||||
: instruction(),
|
||||
module(NULL),
|
||||
|
|
@ -47,9 +60,29 @@ struct StackFrame {
|
|||
function_base(),
|
||||
source_file_name(),
|
||||
source_line(),
|
||||
source_line_base() {}
|
||||
source_line_base(),
|
||||
trust(FRAME_TRUST_NONE) {}
|
||||
virtual ~StackFrame() {}
|
||||
|
||||
// Return a string describing how this stack frame was found
|
||||
// by the stackwalker.
|
||||
string trust_description() const {
|
||||
switch (trust) {
|
||||
case StackFrame::FRAME_TRUST_NONE:
|
||||
return "unknown";
|
||||
case StackFrame::FRAME_TRUST_CONTEXT:
|
||||
return "given as instruction pointer in context";
|
||||
case StackFrame::FRAME_TRUST_CFI:
|
||||
return "call frame info";
|
||||
case StackFrame::FRAME_TRUST_CFI_SCAN:
|
||||
return "call frame info with scanning";
|
||||
case StackFrame::FRAME_TRUST_FP:
|
||||
return "previous frame's frame pointer";
|
||||
case StackFrame::FRAME_TRUST_SCAN:
|
||||
return "stack scanning";
|
||||
}
|
||||
};
|
||||
|
||||
// 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
|
||||
|
|
@ -77,6 +110,10 @@ struct StackFrame {
|
|||
// The start address of the source line, may be omitted if debug symbols
|
||||
// are not available.
|
||||
u_int64_t source_line_base;
|
||||
|
||||
// Amount of trust the stack walker has in the instruction pointer
|
||||
// of this frame.
|
||||
FrameTrust trust;
|
||||
};
|
||||
|
||||
} // namespace google_breakpad
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue