breakpad/src/processor/crash_report_processor.cc
mmentovai 6dd21d3baf Change interface for providing files to Minidump (#19). r=bryner
- Interface change: Minidump constructor now accepts a const string& path
   argument instead of int fd.  Minidump will open the file on first Read
   and close it upon destruction.
 - Adapt callers to new interface, no longer leaking file descriptors.

http://groups.google.com/group/airbag-dev/browse_thread/thread/ff24dbcde7db8ae3


git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@20 4c0a9323-5329-0410-9bdc-e9ce6186880e
2006-09-08 16:41:17 +00:00

65 lines
1.8 KiB
C++

// 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 "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) {
Minidump dump(minidump_file);
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