diff options
author | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2009-06-12 20:36:53 +0000 |
---|---|---|
committer | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2009-06-12 20:36:53 +0000 |
commit | 61e88c7ad7eb072977b4d4d26bcf8929b75af2d4 (patch) | |
tree | 1a01c4085f3a246fa4d51a8fbe69144544bcb752 /src/client/mac/handler/exception_handler.cc | |
parent | Fix for generating dumps on-demand to set the requesting thread to the curren... (diff) | |
download | breakpad-61e88c7ad7eb072977b4d4d26bcf8929b75af2d4.tar.xz |
issue 323 - OS X exception handler / minidump generator should set exception address correctly for EXC_BAD_ACCESS . r=nealsid at http://breakpad.appspot.com/15002
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@350 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/mac/handler/exception_handler.cc')
-rw-r--r-- | src/client/mac/handler/exception_handler.cc | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/client/mac/handler/exception_handler.cc b/src/client/mac/handler/exception_handler.cc index fd6ea836..8c4a0d50 100644 --- a/src/client/mac/handler/exception_handler.cc +++ b/src/client/mac/handler/exception_handler.cc @@ -296,6 +296,7 @@ bool ExceptionHandler::WriteMinidump(const string &dump_path, bool ExceptionHandler::WriteMinidumpWithException(int exception_type, int exception_code, + int exception_subcode, mach_port_t thread_name) { bool result = false; @@ -303,6 +304,7 @@ bool ExceptionHandler::WriteMinidumpWithException(int exception_type, if (directCallback_(callback_context_, exception_type, exception_code, + exception_subcode, thread_name) ) { if (exception_type && exception_code) _exit(exception_type); @@ -320,7 +322,8 @@ bool ExceptionHandler::WriteMinidumpWithException(int exception_type, if (filter_ && !filter_(callback_context_)) return false; - md.SetExceptionInformation(exception_type, exception_code, thread_name); + md.SetExceptionInformation(exception_type, exception_code, + exception_subcode, thread_name); } result = md.Write(next_minidump_path_c_); @@ -476,7 +479,7 @@ void *ExceptionHandler::WaitForMessage(void *exception_handler_class) { // Write out the dump and save the result for later retrieval self->last_minidump_write_result_ = - self->WriteMinidumpWithException(0, 0, 0); + self->WriteMinidumpWithException(0, 0, 0, 0); self->UninstallHandler(false); @@ -506,11 +509,15 @@ void *ExceptionHandler::WaitForMessage(void *exception_handler_class) { gBreakpadAllocator->Unprotect(); #endif - // Generate the minidump with the exception data. - self->WriteMinidumpWithException(receive.exception, receive.code[0], - receive.thread.name); + int subcode = 0; + if (receive.exception == EXC_BAD_ACCESS && receive.code_count > 1) + subcode = receive.code[1]; - self->UninstallHandler(true); + // Generate the minidump with the exception data. + self->WriteMinidumpWithException(receive.exception, receive.code[0], + subcode, receive.thread.name); + + self->UninstallHandler(true); #if USE_PROTECTED_ALLOCATIONS if(gBreakpadAllocator) |