diff options
author | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-10-01 13:01:57 +0000 |
---|---|---|
committer | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-10-01 13:01:57 +0000 |
commit | 8c33b3e9c95a67a9bb06c033d5d4c28d9a55168b (patch) | |
tree | ef075e1413f52c73ce23e3a967d4cfa1311745e1 /src/google_breakpad/processor/stackwalker.h | |
parent | Fix a segmentation fault bug in MinidumpAssertion::Read(). (diff) | |
download | breakpad-8c33b3e9c95a67a9bb06c033d5d4c28d9a55168b.tar.xz |
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
Diffstat (limited to 'src/google_breakpad/processor/stackwalker.h')
-rw-r--r-- | src/google_breakpad/processor/stackwalker.h | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/google_breakpad/processor/stackwalker.h b/src/google_breakpad/processor/stackwalker.h index 36d721d1..8dd2a971 100644 --- a/src/google_breakpad/processor/stackwalker.h +++ b/src/google_breakpad/processor/stackwalker.h @@ -44,12 +44,12 @@ #include <set> #include <string> #include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" namespace google_breakpad { class CallStack; -class CodeModules; -class MemoryRegion; class MinidumpContext; class SourceLineResolverInterface; struct StackFrame; @@ -108,6 +108,39 @@ class Stackwalker { // Returns false otherwise. bool InstructionAddressSeemsValid(u_int64_t address); + // Scan the stack starting at location_start, looking for an address + // that looks like a valid instruction pointer. Addresses must + // 1) be contained in the current stack memory + // 2) pass the checks in InstructionAddressSeemsValid + // + // Returns true if a valid-looking instruction pointer was found. + // When returning true, sets location_found to the address at which + // the value was found, and ip_found to the value contained at that + // location in memory. + template<typename InstructionType> + bool ScanForReturnAddress(InstructionType location_start, + InstructionType *location_found, + InstructionType *ip_found) { + const int kRASearchWords = 15; + for (InstructionType location = location_start; + location <= location_start + kRASearchWords * sizeof(InstructionType); + location += sizeof(InstructionType)) { + InstructionType ip; + if (!memory_->GetMemoryAtAddress(location, &ip)) + break; + + if (modules_ && modules_->GetModuleForAddress(ip) && + InstructionAddressSeemsValid(ip)) { + + *ip_found = ip; + *location_found = location; + return true; + } + } + // nothing found + return false; + } + // Information about the system that produced the minidump. Subclasses // and the SymbolSupplier may find this information useful. const SystemInfo *system_info_; |