diff options
Diffstat (limited to 'src/processor/minidump_stackwalk.cc')
-rw-r--r-- | src/processor/minidump_stackwalk.cc | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/src/processor/minidump_stackwalk.cc b/src/processor/minidump_stackwalk.cc index 4fbee425..62bfd555 100644 --- a/src/processor/minidump_stackwalk.cc +++ b/src/processor/minidump_stackwalk.cc @@ -37,6 +37,8 @@ #include <string> #include "google_airbag/processor/call_stack.h" +#include "google_airbag/processor/code_module.h" +#include "google_airbag/processor/code_modules.h" #include "google_airbag/processor/minidump.h" #include "google_airbag/processor/minidump_processor.h" #include "google_airbag/processor/process_state.h" @@ -49,6 +51,8 @@ namespace { using std::string; using google_airbag::CallStack; +using google_airbag::CodeModule; +using google_airbag::CodeModules; using google_airbag::MinidumpModule; using google_airbag::MinidumpProcessor; using google_airbag::PathnameStripper; @@ -90,8 +94,8 @@ static void PrintStack(const CallStack *stack, const string &cpu) { const StackFrame *frame = stack->frames()->at(frame_index); printf("%2d ", frame_index); - if (!frame->module_name.empty()) { - printf("%s", PathnameStripper::File(frame->module_name).c_str()); + if (frame->module) { + printf("%s", PathnameStripper::File(frame->module->code_file()).c_str()); if (!frame->function_name.empty()) { printf("!%s", frame->function_name.c_str()); if (!frame->source_file_name.empty()) { @@ -104,7 +108,7 @@ static void PrintStack(const CallStack *stack, const string &cpu) { printf(" + 0x%llx", frame->instruction - frame->function_base); } } else { - printf(" + 0x%llx", frame->instruction - frame->module_base); + printf(" + 0x%llx", frame->instruction - frame->module->base_address()); } } else { printf("0x%llx", frame->instruction); @@ -147,6 +151,29 @@ static void PrintStack(const CallStack *stack, const string &cpu) { } } +static void PrintModules(const CodeModules *modules) { + if (!modules) + return; + + printf("\n"); + printf("Loaded modules:\n"); + + u_int64_t main_address = modules->GetMainModule()->base_address(); + + unsigned int module_count = modules->module_count(); + for (unsigned int module_sequence = 0; + module_sequence < module_count; + ++module_sequence) { + const CodeModule *module = modules->GetModuleAtSequence(module_sequence); + u_int64_t base_address = module->base_address(); + printf("0x%08llx - 0x%08llx %s %s%s\n", + base_address, base_address + module->size() - 1, + PathnameStripper::File(module->code_file()).c_str(), + module->version().empty() ? "???" : module->version().c_str(), + module->base_address() == main_address ? " (main)" : ""); + } +} + // Processes |minidump_file| using MinidumpProcessor. |symbol_path|, if // non-empty, is the base directory of a symbol storage area, laid out in // the format required by SimpleSymbolSupplier. If such a storage area @@ -217,6 +244,8 @@ static bool PrintMinidumpProcess(const string &minidump_file, } } + PrintModules(process_state->modules()); + return true; } |