aboutsummaryrefslogtreecommitdiff
path: root/src/client/windows/crash_generation/crash_generation_client.cc
diff options
context:
space:
mode:
authorted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2011-11-11 19:05:51 +0000
committerted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2011-11-11 19:05:51 +0000
commit06cede988b4d15b4d6b7e759fda676bfe3455682 (patch)
treefbe6cc1e33d29d251cf912aac1f35a5e7d823274 /src/client/windows/crash_generation/crash_generation_client.cc
parent Correct leak. (diff)
downloadbreakpad-06cede988b4d15b4d6b7e759fda676bfe3455682.tar.xz
Allow CrashGenerationClient to request that a dump of the parent process be written.
A=Jim Mathies <jmathies@mozilla.com> R=ted at https://bugzilla.mozilla.org/show_bug.cgi?id=679238 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@883 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/windows/crash_generation/crash_generation_client.cc')
-rw-r--r--src/client/windows/crash_generation/crash_generation_client.cc36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/client/windows/crash_generation/crash_generation_client.cc b/src/client/windows/crash_generation/crash_generation_client.cc
index 5e4e3cb9..304c6061 100644
--- a/src/client/windows/crash_generation/crash_generation_client.cc
+++ b/src/client/windows/crash_generation/crash_generation_client.cc
@@ -194,6 +194,7 @@ bool CrashGenerationClient::RegisterClient(HANDLE pipe) {
custom_info_,
NULL,
NULL,
+ NULL,
NULL);
ProtocolMessage reply;
DWORD bytes_count = 0;
@@ -220,8 +221,10 @@ bool CrashGenerationClient::RegisterClient(HANDLE pipe) {
if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) {
return false;
}
+
crash_event_ = reply.dump_request_handle;
crash_generated_ = reply.dump_generated_handle;
+ parent_dump_request_event_ = reply.parent_dump_request_handle;
server_alive_ = reply.server_alive_handle;
server_process_id_ = reply.pid;
@@ -271,6 +274,39 @@ bool CrashGenerationClient::IsRegistered() const {
return crash_event_ != NULL;
}
+bool CrashGenerationClient::RequestParentDump() {
+ if (!IsRegistered()) {
+ return false;
+ }
+
+ assert(parent_dump_request_event_);
+ assert(server_alive_);
+
+ // Reset the dump generated event before signaling the crash
+ // event so that the server can set the dump generated event
+ // once it is done generating the event.
+ if (!ResetEvent(crash_generated_)) {
+ return false;
+ }
+
+ // Signal we want a server side crash dump generated
+ if (!SetEvent(parent_dump_request_event_)) {
+ return false;
+ }
+
+ // Wait for the crash dump process to complete
+ HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_};
+
+ DWORD result = WaitForMultipleObjects(kWaitEventCount,
+ wait_handles,
+ FALSE,
+ kWaitForServerTimeoutMs);
+
+ // Crash dump was successfully generated only if the server
+ // signaled the crash generated event.
+ return result == WAIT_OBJECT_0;
+}
+
bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info,
MDRawAssertionInfo* assert_info) {
if (!IsRegistered()) {