aboutsummaryrefslogtreecommitdiff
path: root/src/client/mac/handler
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/mac/handler')
-rw-r--r--src/client/mac/handler/exception_handler.cc22
-rw-r--r--src/client/mac/handler/exception_handler.h16
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