aboutsummaryrefslogtreecommitdiff
path: root/src/processor/minidump_stackwalk.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/processor/minidump_stackwalk.cc')
-rw-r--r--src/processor/minidump_stackwalk.cc35
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;
}