diff options
author | ted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2012-09-17 14:01:28 +0000 |
---|---|---|
committer | ted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2012-09-17 14:01:28 +0000 |
commit | 52935b4e812f413beaf294b24e5677c0324f98b6 (patch) | |
tree | 69bafaa55473940b8568f001ea068fde445a5452 /src/processor/minidump.cc | |
parent | Make my_str_len/my_itos take uintmax_t (diff) | |
download | breakpad-52935b4e812f413beaf294b24e5677c0324f98b6.tar.xz |
Add a GetInstructionPointer method to MinidumpException
R=mark at https://breakpad.appspot.com/444003/
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1039 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/processor/minidump.cc')
-rw-r--r-- | src/processor/minidump.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc index d88101f6..19ba0354 100644 --- a/src/processor/minidump.cc +++ b/src/processor/minidump.cc @@ -714,6 +714,41 @@ u_int32_t MinidumpContext::GetContextCPU() const { return context_flags_ & MD_CONTEXT_CPU_MASK; } +bool MinidumpContext::GetInstructionPointer(u_int64_t* ip) const { + BPLOG_IF(ERROR, !ip) << "MinidumpContext::GetInstructionPointer " + "requires |ip|"; + assert(ip); + *ip = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpContext for GetInstructionPointer"; + return false; + } + + switch (context_flags_ & MD_CONTEXT_CPU_MASK) { + case MD_CONTEXT_AMD64: + *ip = context_.amd64->rip; + break; + case MD_CONTEXT_ARM: + *ip = context_.arm->iregs[MD_CONTEXT_ARM_REG_PC]; + break; + case MD_CONTEXT_PPC: + *ip = context_.ppc->srr0; + break; + case MD_CONTEXT_SPARC: + *ip = context_.ctx_sparc->pc; + break; + case MD_CONTEXT_X86: + *ip = context_.x86->eip; + break; + default: + // This should never happen. + BPLOG(ERROR) << "Unknown CPU architecture in GetInstructionPointer"; + return false; + } + return true; +} + const MDRawContextX86* MinidumpContext::GetContextX86() const { if (GetContextCPU() != MD_CONTEXT_X86) { |