Add -s flag to microdump_stackwalk for dumping stack contents.

Note that the current MicrodumpProcessor::Process implementation has a
bug due to the fact that it creates a local Microdump instance, and then
holds onto a pointer to the object returned by microdump.GetMemory()
which is destroyed when microdump goes out of scope. This CL fixes the
crash by making Microdump outlive MicrodumpProcessor, which is the same
pattern that Minidump/MinidumpProcessor uses.

Bug: google-breakpad:748
Change-Id: I554b46d309649cf404523722bd9ee39e17a10139
Reviewed-on: https://chromium-review.googlesource.com/720809
Reviewed-by: Primiano Tucci <primiano@chromium.org>
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
This commit is contained in:
Tobias Sargeant 2017-10-16 10:22:57 +01:00 committed by Tobias Sargeant
parent 623c4a0f42
commit 3d6076efc2
6 changed files with 32 additions and 30 deletions

View file

@ -54,24 +54,18 @@ MicrodumpProcessor::MicrodumpProcessor(StackFrameSymbolizer* frame_symbolizer)
MicrodumpProcessor::~MicrodumpProcessor() {}
ProcessResult MicrodumpProcessor::Process(const string &microdump_contents,
ProcessResult MicrodumpProcessor::Process(Microdump *microdump,
ProcessState* process_state) {
assert(process_state);
process_state->Clear();
if (microdump_contents.empty()) {
BPLOG(ERROR) << "Microdump is empty.";
return PROCESS_ERROR_MINIDUMP_NOT_FOUND;
}
Microdump microdump(microdump_contents);
process_state->modules_ = microdump.GetModules()->Copy();
process_state->modules_ = microdump->GetModules()->Copy();
scoped_ptr<Stackwalker> stackwalker(
Stackwalker::StackwalkerForCPU(
&process_state->system_info_,
microdump.GetContext(),
microdump.GetMemory(),
microdump->GetContext(),
microdump->GetMemory(),
process_state->modules_,
/* unloaded_modules= */ NULL,
frame_symbolizer_));
@ -90,12 +84,12 @@ ProcessResult MicrodumpProcessor::Process(const string &microdump_contents,
}
process_state->threads_.push_back(stack.release());
process_state->thread_memory_regions_.push_back(microdump.GetMemory());
process_state->thread_memory_regions_.push_back(microdump->GetMemory());
process_state->crashed_ = true;
process_state->requesting_thread_ = 0;
process_state->system_info_ = *microdump.GetSystemInfo();
process_state->crash_reason_ = microdump.GetCrashReason();
process_state->crash_address_ = microdump.GetCrashAddress();
process_state->system_info_ = *microdump->GetSystemInfo();
process_state->crash_reason_ = microdump->GetCrashReason();
process_state->crash_address_ = microdump->GetCrashAddress();
return PROCESS_OK;
}