gecko/toolkit/crashreporter/test/dumputils.cpp

61 lines
1.6 KiB
C++
Raw Normal View History

#include "google_breakpad/processor/minidump.h"
#include "nscore.h"
using namespace google_breakpad;
// Return true if the specified minidump contains a stream of |stream_type|.
extern "C"
NS_EXPORT bool
DumpHasStream(const char* dump_file, u_int32_t stream_type)
{
Minidump dump(dump_file);
if (!dump.Read())
return false;
u_int32_t length;
if (!dump.SeekToStreamType(stream_type, &length) || length == 0)
return false;
return true;
}
// Return true if the specified minidump contains a memory region
// that contains the instruction pointer from the exception record.
extern "C"
NS_EXPORT bool
DumpHasInstructionPointerMemory(const char* dump_file)
{
Minidump minidump(dump_file);
if (!minidump.Read())
return false;
MinidumpException* exception = minidump.GetException();
MinidumpMemoryList* memory_list = minidump.GetMemoryList();
if (!exception || !memory_list) {
return false;
}
MinidumpContext* context = exception->GetContext();
if (!context)
return false;
u_int64_t instruction_pointer;
switch (context->GetContextCPU()) {
case MD_CONTEXT_X86:
instruction_pointer = context->GetContextX86()->eip;
break;
case MD_CONTEXT_AMD64:
instruction_pointer = context->GetContextAMD64()->rip;
break;
case MD_CONTEXT_ARM:
instruction_pointer = context->GetContextARM()->iregs[15];
break;
default:
return false;
}
MinidumpMemoryRegion* region =
memory_list->GetMemoryRegionForAddress(instruction_pointer);
return region != NULL;
}