mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
448825c6d2
--HG-- extra : rebase_source : c5fd538fdfb532eeed4c4265eb93a69bfac485aa
61 lines
1.6 KiB
C++
61 lines
1.6 KiB
C++
#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;
|
|
}
|