Update reporting strings for exceptions (Issue 88)
Add time_date_stamp to process state. git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@75 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
db3342a10e
commit
daf4211942
2 changed files with 258 additions and 6 deletions
|
@ -50,6 +50,7 @@ class ProcessState {
|
|||
~ProcessState();
|
||||
|
||||
// Accessors. See the data declarations below.
|
||||
u_int32_t time_date_stamp() const { return time_date_stamp_; }
|
||||
bool crashed() const { return crashed_; }
|
||||
string crash_reason() const { return crash_reason_; }
|
||||
u_int64_t crash_address() const { return crash_address_; }
|
||||
|
@ -66,9 +67,12 @@ class ProcessState {
|
|||
friend class MinidumpProcessor;
|
||||
|
||||
// Disallow instantiation other than by friends.
|
||||
ProcessState() : crashed_(false), crash_reason_(), crash_address_(0),
|
||||
requesting_thread_(-1), threads_(), os_(), os_version_(),
|
||||
cpu_(), cpu_info_(), modules_(NULL) {}
|
||||
ProcessState() : time_date_stamp_(0), crashed_(false), crash_reason_(),
|
||||
crash_address_(0), requesting_thread_(-1), threads_(),
|
||||
os_(), os_version_(), cpu_(), cpu_info_(), modules_(NULL) {}
|
||||
|
||||
// The time-date stamp of the minidump (time_t format)
|
||||
u_int32_t time_date_stamp_;
|
||||
|
||||
// True if the process crashed, false if the dump was produced outside
|
||||
// of an exception handler.
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <cassert>
|
||||
|
||||
#include "google_airbag/processor/minidump_processor.h"
|
||||
#include "google_airbag/processor/call_stack.h"
|
||||
#include "google_airbag/processor/minidump.h"
|
||||
|
@ -51,6 +53,10 @@ ProcessState* MinidumpProcessor::Process(const string &minidump_file) {
|
|||
|
||||
scoped_ptr<ProcessState> process_state(new ProcessState());
|
||||
|
||||
const MDRawHeader *header = dump.header();
|
||||
assert(header);
|
||||
process_state->time_date_stamp_ = header->time_date_stamp;
|
||||
|
||||
process_state->cpu_ = GetCPUInfo(&dump, &process_state->cpu_info_);
|
||||
process_state->os_ = GetOSInfo(&dump, &process_state->os_version_);
|
||||
|
||||
|
@ -320,9 +326,10 @@ string MinidumpProcessor::GetCrashReason(Minidump *dump, u_int64_t *address) {
|
|||
// map the codes to a string (because there's no system info, or because
|
||||
// it's an unrecognized platform, or because it's an unrecognized code.)
|
||||
char reason_string[24];
|
||||
u_int32_t exception_code = raw_exception->exception_record.exception_code;
|
||||
u_int32_t exception_flags = raw_exception->exception_record.exception_flags;
|
||||
snprintf(reason_string, sizeof(reason_string), "0x%08x / 0x%08x",
|
||||
raw_exception->exception_record.exception_code,
|
||||
raw_exception->exception_record.exception_flags);
|
||||
exception_code, exception_flags);
|
||||
string reason = reason_string;
|
||||
|
||||
const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, NULL);
|
||||
|
@ -330,9 +337,250 @@ string MinidumpProcessor::GetCrashReason(Minidump *dump, u_int64_t *address) {
|
|||
return reason;
|
||||
|
||||
switch (raw_system_info->platform_id) {
|
||||
case MD_OS_MAC_OS_X: {
|
||||
char flags_string[11];
|
||||
snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags);
|
||||
switch (exception_code) {
|
||||
case MD_EXCEPTION_MAC_BAD_ACCESS:
|
||||
reason = "EXC_BAD_ACCESS / ";
|
||||
switch (exception_flags) {
|
||||
case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS:
|
||||
reason.append("KERN_INVALID_ADDRESS");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE:
|
||||
reason.append("KERN_PROTECTION_FAILURE");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_NO_ACCESS:
|
||||
reason.append("KERN_NO_ACCESS");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE:
|
||||
reason.append("KERN_MEMORY_FAILURE");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR:
|
||||
reason.append("KERN_MEMORY_ERROR");
|
||||
break;
|
||||
// These are ppc only but shouldn't be a problem as they're
|
||||
// unused on x86
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ:
|
||||
reason.append("EXC_PPC_VM_PROT_READ");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE:
|
||||
reason.append("EXC_PPC_BADSPACE");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED:
|
||||
reason.append("EXC_PPC_UNALIGNED");
|
||||
break;
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_BAD_INSTRUCTION:
|
||||
reason = "EXC_BAD_INSTRUCTION / ";
|
||||
switch (raw_system_info->processor_architecture) {
|
||||
case MD_CPU_ARCHITECTURE_PPC: {
|
||||
switch (exception_flags) {
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL:
|
||||
reason.append("EXC_PPC_INVALID_SYSCALL");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION:
|
||||
reason.append("EXC_PPC_UNIPL_INST");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION:
|
||||
reason.append("EXC_PPC_PRIVINST");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER:
|
||||
reason.append("EXC_PPC_PRIVREG");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_TRACE:
|
||||
reason.append("EXC_PPC_TRACE");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR:
|
||||
reason.append("EXC_PPC_PERFMON");
|
||||
break;
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MD_CPU_ARCHITECTURE_X86: {
|
||||
switch (exception_flags) {
|
||||
case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION:
|
||||
reason.append("EXC_I386_INVOP");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT:
|
||||
reason.append("EXC_INVTSSFLT");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT:
|
||||
reason.append("EXC_SEGNPFLT");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT:
|
||||
reason.append("EXC_STKFLT");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT:
|
||||
reason.append("EXC_GPFLT");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT:
|
||||
reason.append("EXC_ALIGNFLT");
|
||||
break;
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_ARITHMETIC:
|
||||
reason = "EXC_ARITHMETIC / ";
|
||||
switch (raw_system_info->processor_architecture) {
|
||||
case MD_CPU_ARCHITECTURE_PPC: {
|
||||
switch (exception_flags) {
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW:
|
||||
reason.append("EXC_PPC_OVERFLOW");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE:
|
||||
reason.append("EXC_PPC_ZERO_DIVIDE");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT:
|
||||
reason.append("EXC_FLT_INEXACT");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE:
|
||||
reason.append("EXC_PPC_FLT_ZERO_DIVIDE");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW:
|
||||
reason.append("EXC_PPC_FLT_UNDERFLOW");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW:
|
||||
reason.append("EXC_PPC_FLT_OVERFLOW");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER:
|
||||
reason.append("EXC_PPC_FLT_NOT_A_NUMBER");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION:
|
||||
reason.append("EXC_PPC_NOEMULATION");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST:
|
||||
reason.append("EXC_PPC_ALTIVECASSIST");
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MD_CPU_ARCHITECTURE_X86: {
|
||||
switch (exception_flags) {
|
||||
case MD_EXCEPTION_CODE_MAC_X86_DIV:
|
||||
reason.append("EXC_I386_DIV");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_INTO:
|
||||
reason.append("EXC_I386_INTO");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_NOEXT:
|
||||
reason.append("EXC_I386_NOEXT");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_EXTOVR:
|
||||
reason.append("EXC_I386_EXTOVR");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_EXTERR:
|
||||
reason.append("EXC_I386_EXTERR");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_EMERR:
|
||||
reason.append("EXC_I386_EMERR");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_BOUND:
|
||||
reason.append("EXC_I386_BOUND");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR:
|
||||
reason.append("EXC_I386_SSEEXTERR");
|
||||
break;
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_EMULATION:
|
||||
reason = "EXC_EMULATION / ";
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_SOFTWARE:
|
||||
reason = "EXC_SOFTWARE / ";
|
||||
switch (exception_flags) {
|
||||
// These are ppc only but shouldn't be a problem as they're
|
||||
// unused on x86
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_TRAP:
|
||||
reason.append("EXC_PPC_TRAP");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE:
|
||||
reason.append("EXC_PPC_MIGRATE");
|
||||
break;
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_BREAKPOINT:
|
||||
reason = "EXC_BREAKPOINT / ";
|
||||
switch (raw_system_info->processor_architecture) {
|
||||
case MD_CPU_ARCHITECTURE_PPC: {
|
||||
switch (exception_flags) {
|
||||
case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT:
|
||||
reason.append("EXC_PPC_BREAKPOINT");
|
||||
break;
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MD_CPU_ARCHITECTURE_X86: {
|
||||
switch (exception_flags) {
|
||||
case MD_EXCEPTION_CODE_MAC_X86_SGL:
|
||||
reason.append("EXC_I386_SGL");
|
||||
break;
|
||||
case MD_EXCEPTION_CODE_MAC_X86_BPT:
|
||||
reason.append("EXC_I386_BPT");
|
||||
break;
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_SYSCALL:
|
||||
reason = "EXC_SYSCALL / ";
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_MACH_SYSCALL:
|
||||
reason = "EXC_MACH_SYSCALL / ";
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
case MD_EXCEPTION_MAC_RPC_ALERT:
|
||||
reason = "EXC_RPC_ALERT / ";
|
||||
reason.append(flags_string);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case MD_OS_WIN32_NT:
|
||||
case MD_OS_WIN32_WINDOWS: {
|
||||
switch (raw_exception->exception_record.exception_code) {
|
||||
switch (exception_code) {
|
||||
case MD_EXCEPTION_CODE_WIN_CONTROL_C:
|
||||
reason = "DBG_CONTROL_C";
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue