diff options
author | ted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-08-13 20:18:58 +0000 |
---|---|---|
committer | ted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-08-13 20:18:58 +0000 |
commit | 315fd78199bc606ee02cb085dacadd58e0fc40c8 (patch) | |
tree | 2ef03316d391e2f5fa9310af188b5a65a57dccdd /src/client/mac/handler | |
parent | Add protobuf external reference to third_party. (diff) | |
download | breakpad-315fd78199bc606ee02cb085dacadd58e0fc40c8.tar.xz |
Implement CrashGeneration{Client,Server} for OOP dump generation on OS X, enable OOP dump generation in ExceptionHandler
R=mark at http://breakpad.appspot.com/146001
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@646 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/mac/handler')
-rw-r--r-- | src/client/mac/handler/exception_handler.cc | 22 | ||||
-rw-r--r-- | src/client/mac/handler/exception_handler.h | 16 |
2 files changed, 34 insertions, 4 deletions
diff --git a/src/client/mac/handler/exception_handler.cc b/src/client/mac/handler/exception_handler.cc index 80535318..ccf1ff99 100644 --- a/src/client/mac/handler/exception_handler.cc +++ b/src/client/mac/handler/exception_handler.cc @@ -221,7 +221,8 @@ ExceptionHandler::ExceptionHandler(const string &dump_path, FilterCallback filter, MinidumpCallback callback, void *callback_context, - bool install_handler) + bool install_handler, + const char *port_name) : dump_path_(), filter_(filter), callback_(callback), @@ -237,6 +238,8 @@ ExceptionHandler::ExceptionHandler(const string &dump_path, // This will update to the ID and C-string pointers set_dump_path(dump_path); MinidumpGenerator::GatherSystemInformation(); + if (port_name) + crash_generation_client_.reset(new CrashGenerationClient(port_name)); Setup(install_handler); } @@ -293,7 +296,8 @@ bool ExceptionHandler::WriteMinidump() { bool ExceptionHandler::WriteMinidump(const string &dump_path, MinidumpCallback callback, void *callback_context) { - ExceptionHandler handler(dump_path, NULL, callback, callback_context, false); + ExceptionHandler handler(dump_path, NULL, callback, callback_context, false, + NULL); return handler.WriteMinidump(); } @@ -312,6 +316,18 @@ bool ExceptionHandler::WriteMinidumpWithException(int exception_type, if (exception_type && exception_code) _exit(exception_type); } + } else if (IsOutOfProcess()) { + if (exception_type && exception_code) { + // If this is a real exception, give the filter (if any) a chance to + // decide if this should be sent. + if (filter_ && !filter_(callback_context_)) + return false; + return crash_generation_client_->RequestDumpForException( + exception_type, + exception_code, + exception_subcode, + thread_name); + } } else { string minidump_id; @@ -321,7 +337,7 @@ bool ExceptionHandler::WriteMinidumpWithException(int exception_type, MinidumpGenerator md; if (exception_type && exception_code) { // If this is a real exception, give the filter (if any) a chance to - // decided if this should be sent + // decide if this should be sent. if (filter_ && !filter_(callback_context_)) return false; diff --git a/src/client/mac/handler/exception_handler.h b/src/client/mac/handler/exception_handler.h index 896eecda..ee3e2e1d 100644 --- a/src/client/mac/handler/exception_handler.h +++ b/src/client/mac/handler/exception_handler.h @@ -40,6 +40,9 @@ #include <string> +#include "client/mac/crash_generation/crash_generation_client.h" +#include "processor/scoped_ptr.h" + namespace google_breakpad { using std::string; @@ -86,9 +89,12 @@ class ExceptionHandler { // If install_handler is true, then a minidump will be written whenever // an unhandled exception occurs. If it is false, minidumps will only // be written when WriteMinidump is called. + // If port_name is non-NULL, attempt to perform out-of-process dump generation + // If port_name is NULL, in-process dump generation will be used. ExceptionHandler(const string &dump_path, FilterCallback filter, MinidumpCallback callback, - void *callback_context, bool install_handler); + void *callback_context, bool install_handler, + const char *port_name); // A special constructor if we want to bypass minidump writing and // simply get a callback with the exception information. @@ -115,6 +121,11 @@ class ExceptionHandler { static bool WriteMinidump(const string &dump_path, MinidumpCallback callback, void *callback_context); + // Returns whether out-of-process dump generation is used or not. + bool IsOutOfProcess() const { + return crash_generation_client_.get() != NULL; + } + private: // Install the mach exception handler bool InstallHandler(); @@ -206,6 +217,9 @@ class ExceptionHandler { // True, if we're using the mutext to indicate when mindump writing occurs bool use_minidump_write_mutex_; + + // Client for out-of-process dump generation. + scoped_ptr<CrashGenerationClient> crash_generation_client_; }; } // namespace google_breakpad |