breakpad/src/processor/crash_report_processor.cc

73 lines
2.0 KiB
C++
Raw Normal View History

// 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