aboutsummaryrefslogtreecommitdiff
path: root/src/processor/stackwalker.cc
diff options
context:
space:
mode:
authorted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2009-10-08 14:21:50 +0000
committerted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2009-10-08 14:21:50 +0000
commit8d70618ffc6f87bfd3d7bfd05c87c35ec3179a7a (patch)
treee58154807c1a5f40d9465f4ee389144402c10cb3 /src/processor/stackwalker.cc
parent760d66430e41ea9b817492b2137268e41430035b (diff)
downloadgoogle-breakpad-8d70618ffc6f87bfd3d7bfd05c87c35ec3179a7a.tar.gz
Let x86 stackwalker scan stack in cases where program evaluation fails. Original patch by Jeff Muizelaar <jmuizelaar@mozilla.com> with some changes by me. r=mento at http://breakpad.appspot.com/32003/show
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@409 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/processor/stackwalker.cc')
-rw-r--r--src/processor/stackwalker.cc34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/processor/stackwalker.cc b/src/processor/stackwalker.cc
index de67bdaa..96ee6db0 100644
--- a/src/processor/stackwalker.cc
+++ b/src/processor/stackwalker.cc
@@ -189,5 +189,39 @@ Stackwalker* Stackwalker::StackwalkerForCPU(
return cpu_stackwalker;
}
+bool Stackwalker::InstructionAddressSeemsValid(u_int64_t address) {
+ const CodeModule *module = modules_->GetModuleForAddress(address);
+ if (!module) {
+ // not inside any loaded module
+ return false;
+ }
+
+ if (!resolver_ || !supplier_) {
+ // we don't have a resolver and or symbol supplier,
+ // but we're inside a known module
+ return true;
+ }
+
+ if (!resolver_->HasModule(module->code_file())) {
+ string symbol_data, symbol_file;
+ SymbolSupplier::SymbolResult symbol_result =
+ supplier_->GetSymbolFile(module, system_info_,
+ &symbol_file, &symbol_data);
+
+ if (symbol_result != SymbolSupplier::FOUND ||
+ !resolver_->LoadModuleUsingMapBuffer(module->code_file(),
+ symbol_data)) {
+ // we don't have symbols, but we're inside a loaded module
+ return true;
+ }
+ }
+
+ StackFrame frame;
+ frame.module = module;
+ frame.instruction = address;
+ resolver_->FillSourceLineInfo(&frame);
+ // we have symbols, so return true if inside a function
+ return !frame.function_name.empty();
+}
} // namespace google_breakpad