Keeping track of modules without symbols during crash report processing.

http://breakpad.appspot.com/534002/



git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1126 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
ivan.penkov@gmail.com
2013-03-06 19:32:13 +00:00
parent 718ae3284e
commit 60b5f7c7e9
10 changed files with 230 additions and 49 deletions

View File

@@ -70,11 +70,16 @@ Stackwalker::Stackwalker(const SystemInfo* system_info,
}
bool Stackwalker::Walk(CallStack* stack) {
bool Stackwalker::Walk(CallStack* stack,
vector<const CodeModule*>* modules_without_symbols) {
BPLOG_IF(ERROR, !stack) << "Stackwalker::Walk requires |stack|";
assert(stack);
stack->Clear();
BPLOG_IF(ERROR, !modules_without_symbols) << "Stackwalker::Walk requires "
<< "|modules_without_symbols|";
assert(modules_without_symbols);
// Begin with the context frame, and keep getting callers until there are
// no more.
@@ -95,6 +100,27 @@ bool Stackwalker::Walk(CallStack* stack) {
return false;
}
// Keep track of modules that have no symbols.
if (symbolizer_result == StackFrameSymbolizer::kError &&
frame->module != NULL) {
bool found = false;
vector<const CodeModule*>::iterator iter;
for (iter = modules_without_symbols->begin();
iter != modules_without_symbols->end();
++iter) {
if (*iter == frame->module) {
found = true;
break;
}
}
if (!found) {
BPLOG(INFO) << "Couldn't load symbols for: "
<< frame->module->debug_file() << "|"
<< frame->module->debug_identifier();
modules_without_symbols->push_back(frame->module);
}
}
// Add the frame to the call stack. Relinquish the ownership claim
// over the frame, because the stack now owns it.
stack->frames_.push_back(frame.release());