diff options
author | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2009-10-08 14:21:50 +0000 |
---|---|---|
committer | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2009-10-08 14:21:50 +0000 |
commit | 8d70618ffc6f87bfd3d7bfd05c87c35ec3179a7a (patch) | |
tree | e58154807c1a5f40d9465f4ee389144402c10cb3 /src/processor/stackwalker.cc | |
parent | 10.6 SDK compatibility fixes. No bug. (diff) | |
download | breakpad-8d70618ffc6f87bfd3d7bfd05c87c35ec3179a7a.tar.xz |
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.cc | 34 |
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 |