#include "google_breakpad/processor/basic_source_line_resolver.h"
#include "google_breakpad/processor/minidump.h"
#include "google_breakpad/processor/minidump_processor.h"
#include "google_breakpad/processor/process_state.h"
#include "cpp/data_definitions.h"
#include "cpp/memstream.h"
#include "cpp/mmap_symbol_supplier.h"
#include "cpp/processor.h"
using google_breakpad::BasicSourceLineResolver;
using google_breakpad::Minidump;
using google_breakpad::MinidumpProcessor;
using google_breakpad::ProcessState;
process_state_t *process_minidump(const char *buffer,
size_t buffer_size,
symbol_entry_t *symbols,
size_t symbol_count,
int *result_out) {
if (buffer == nullptr) {
*result_out = google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND;
return nullptr;
}
ProcessState *state = new ProcessState();
if (state == nullptr) {
*result_out = -1; return nullptr;
}
BasicSourceLineResolver resolver;
MmapSymbolSupplier supplier(symbol_count, symbols);
MinidumpProcessor processor(&supplier, &resolver);
imemstream in(buffer, buffer_size);
Minidump minidump(in);
if (!minidump.Read()) {
*result_out = google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND;
return nullptr;
}
*result_out = processor.Process(&minidump, state);
if (*result_out != google_breakpad::PROCESS_OK) {
delete state;
return nullptr;
}
return process_state_t::cast(state);
}