diff options
author | bryner <bryner@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2006-09-08 02:35:53 +0000 |
---|---|---|
committer | bryner <bryner@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2006-09-08 02:35:53 +0000 |
commit | d5e66382d10b1570d75e924410d58b47857fe799 (patch) | |
tree | 631ca22ac3409363ae8418c7bc846d9e198bed9f /src/processor/crash_report_processor.cc | |
parent | Make SourceLineResolver fill a StackFrame rather than using its own struct (#... (diff) | |
download | breakpad-d5e66382d10b1570d75e924410d58b47857fe799.tar.xz |
Add support to the StackWalker for resolving symbols, using a
caller-implemented SymbolSupplier object to get a symbol file.
Add a CrashReportProcessor object which provides a simple API for processing
a CrashReport struct, given a SymbolSupplier and a minidump file.
r=mmentovai (#17))
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@18 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/processor/crash_report_processor.cc')
-rw-r--r-- | src/processor/crash_report_processor.cc | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/processor/crash_report_processor.cc b/src/processor/crash_report_processor.cc new file mode 100644 index 00000000..1bb894a4 --- /dev/null +++ b/src/processor/crash_report_processor.cc @@ -0,0 +1,72 @@ +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include "google/crash_report.h" +#include "google/crash_report_processor.h" +#include "processor/minidump.h" +#include "processor/stackwalker_x86.h" + +namespace google_airbag { + +CrashReportProcessor::CrashReportProcessor(SymbolSupplier *supplier) + : supplier_(supplier) { +} + +CrashReportProcessor::~CrashReportProcessor() { +} + +bool CrashReportProcessor::ProcessReport(CrashReport *report, + const string &minidump_file) { + int fd = open(minidump_file.c_str(), O_RDONLY); + if (fd == -1) { + return false; + } + + Minidump dump(fd); + if (!dump.Read()) { + return false; + } + + MinidumpException *exception = dump.GetException(); + if (!exception) { + return false; + } + + MinidumpThreadList *threads = dump.GetThreadList(); + if (!threads) { + return false; + } + + // TODO(bryner): get all the threads + MinidumpThread *thread = threads->GetThreadByID(exception->GetThreadID()); + if (!thread) { + return false; + } + + MinidumpMemoryRegion *thread_memory = thread->GetMemory(); + if (!thread_memory) { + return false; + } + + // TODO(bryner): figure out which StackWalker we want + StackwalkerX86 walker(exception->GetContext(), thread_memory, + dump.GetModuleList(), supplier_, report); + walker.Walk(&report->stack_frames); + return true; +} + +} // namespace google_airbag |