diff options
Diffstat (limited to 'src/processor/microdump_stackwalk.cc')
-rw-r--r-- | src/processor/microdump_stackwalk.cc | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/processor/microdump_stackwalk.cc b/src/processor/microdump_stackwalk.cc index 4200636c..46c4127e 100644 --- a/src/processor/microdump_stackwalk.cc +++ b/src/processor/microdump_stackwalk.cc @@ -41,6 +41,7 @@ #include "common/scoped_ptr.h" #include "common/using_std_string.h" #include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/microdump.h" #include "google_breakpad/processor/microdump_processor.h" #include "google_breakpad/processor/process_state.h" #include "google_breakpad/processor/stack_frame_symbolizer.h" @@ -53,12 +54,14 @@ namespace { struct Options { bool machine_readable; + bool output_stack_contents; string microdump_file; std::vector<string> symbol_paths; }; using google_breakpad::BasicSourceLineResolver; +using google_breakpad::Microdump; using google_breakpad::MicrodumpProcessor; using google_breakpad::ProcessResult; using google_breakpad::ProcessState; @@ -81,6 +84,10 @@ int PrintMicrodumpProcess(const Options& options) { std::vector<char> bytes; file_stream.seekg(0, std::ios_base::end); bytes.resize(file_stream.tellg()); + if (bytes.empty()) { + BPLOG(ERROR) << "Microdump is empty."; + return 1; + } file_stream.seekg(0, std::ios_base::beg); file_stream.read(&bytes[0], bytes.size()); string microdump_content(&bytes[0], bytes.size()); @@ -94,14 +101,15 @@ int PrintMicrodumpProcess(const Options& options) { StackFrameSymbolizer frame_symbolizer(symbol_supplier.get(), &resolver); ProcessState process_state; MicrodumpProcessor microdump_processor(&frame_symbolizer); - ProcessResult res = microdump_processor.Process(microdump_content, + Microdump microdump(microdump_content); + ProcessResult res = microdump_processor.Process(µdump, &process_state); if (res == google_breakpad::PROCESS_OK) { if (options.machine_readable) { PrintProcessStateMachineReadable(process_state); } else { - PrintProcessState(process_state, false, &resolver); + PrintProcessState(process_state, options.output_stack_contents, &resolver); } return 0; } @@ -120,7 +128,8 @@ static void Usage(int argc, const char *argv[], bool error) { "\n" "Options:\n" "\n" - " -m Output in machine-readable format\n", + " -m Output in machine-readable format\n" + " -s Output stack contents\n", basename(argv[0])); } @@ -128,8 +137,9 @@ static void SetupOptions(int argc, const char *argv[], Options* options) { int ch; options->machine_readable = false; + options->output_stack_contents = false; - while ((ch = getopt(argc, (char * const *)argv, "hm")) != -1) { + while ((ch = getopt(argc, (char * const *)argv, "hms")) != -1) { switch (ch) { case 'h': Usage(argc, argv, false); @@ -139,6 +149,9 @@ static void SetupOptions(int argc, const char *argv[], Options* options) { case 'm': options->machine_readable = true; break; + case 's': + options->output_stack_contents = true; + break; case '?': Usage(argc, argv, true); |