diff options
Diffstat (limited to 'src/processor/minidump_processor.cc')
-rw-r--r-- | src/processor/minidump_processor.cc | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/processor/minidump_processor.cc b/src/processor/minidump_processor.cc index 814402be..a197cd10 100644 --- a/src/processor/minidump_processor.cc +++ b/src/processor/minidump_processor.cc @@ -36,6 +36,7 @@ #include "google_breakpad/processor/minidump.h" #include "google_breakpad/processor/process_state.h" #include "google_breakpad/processor/exploitability.h" +#include "google_breakpad/processor/stack_frame_symbolizer.h" #include "processor/logging.h" #include "processor/scoped_ptr.h" #include "processor/stackwalker_x86.h" @@ -44,18 +45,29 @@ namespace google_breakpad { MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier, SourceLineResolverInterface *resolver) - : supplier_(supplier), resolver_(resolver), + : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)), + own_frame_symbolizer_(true), enable_exploitability_(false) { } MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier, SourceLineResolverInterface *resolver, bool enable_exploitability) - : supplier_(supplier), resolver_(resolver), + : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)), + own_frame_symbolizer_(true), enable_exploitability_(enable_exploitability) { } +MinidumpProcessor::MinidumpProcessor(StackFrameSymbolizer *frame_symbolizer, + bool enable_exploitability) + : frame_symbolizer_(frame_symbolizer), + own_frame_symbolizer_(false), + enable_exploitability_(enable_exploitability) { + assert(frame_symbolizer_); +} + MinidumpProcessor::~MinidumpProcessor() { + if (own_frame_symbolizer_) delete frame_symbolizer_; } ProcessResult MinidumpProcessor::Process( @@ -126,6 +138,10 @@ ProcessResult MinidumpProcessor::Process( bool interrupted = false; bool found_requesting_thread = false; unsigned int thread_count = threads->thread_count(); + + // Reset frame_symbolizer_ at the beginning of stackwalk for each minidump. + frame_symbolizer_->Reset(); + for (unsigned int thread_index = 0; thread_index < thread_count; ++thread_index) { @@ -208,8 +224,7 @@ ProcessResult MinidumpProcessor::Process( context, thread_memory, process_state->modules_, - supplier_, - resolver_)); + frame_symbolizer_)); if (!stackwalker.get()) { BPLOG(ERROR) << "No stackwalker for " << thread_string; return PROCESS_ERROR_NO_STACKWALKER_FOR_THREAD; @@ -1160,7 +1175,8 @@ string MinidumpProcessor::GetAssertion(Minidump *dump) { break; default: { char assertion_type[32]; - sprintf(assertion_type, "0x%08x", raw_assertion->type); + snprintf(assertion_type, sizeof(assertion_type), + "0x%08x", raw_assertion->type); assertion_string = "Unknown assertion type "; assertion_string += assertion_type; break; @@ -1184,7 +1200,7 @@ string MinidumpProcessor::GetAssertion(Minidump *dump) { if (raw_assertion->line != 0) { char assertion_line[32]; - sprintf(assertion_line, "%u", raw_assertion->line); + snprintf(assertion_line, sizeof(assertion_line), "%u", raw_assertion->line); assertion_string.append(" at line "); assertion_string.append(assertion_line); } |