From 5ac32b6534688b71a2b6fe7841cf7e552a992d01 Mon Sep 17 00:00:00 2001 From: mmentovai Date: Mon, 6 Nov 2006 20:54:19 +0000 Subject: Minidumps should indicate which thread generated the dump and which requested dump generation (#57). r=bryner http://groups.google.com/group/airbag-dev/browse_thread/thread/f11758d171261184 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@61 4c0a9323-5329-0410-9bdc-e9ce6186880e --- src/client/windows/handler/exception_handler.cc | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/client/windows/handler/exception_handler.cc') diff --git a/src/client/windows/handler/exception_handler.cc b/src/client/windows/handler/exception_handler.cc index 1d64cf9e..761f3151 100644 --- a/src/client/windows/handler/exception_handler.cc +++ b/src/client/windows/handler/exception_handler.cc @@ -33,6 +33,7 @@ #include "client/windows/handler/exception_handler.h" #include "common/windows/guid_string.h" +#include "google_airbag/common/minidump_format.h" namespace google_airbag { @@ -189,7 +190,26 @@ bool ExceptionHandler::WriteMinidumpWithException(DWORD requesting_thread_id, except_info.ExceptionPointers = exinfo; except_info.ClientPointers = FALSE; - // TODO(mmentovai): include IDs of handler and requesting threads. + // Add an MDRawAirbagInfo stream to the minidump, to provide additional + // information about the exception handler to the Airbag processor. The + // information will help the processor determine which threads are + // relevant. The Airbag processor does not require this information but + // can function better with Airbag-generated dumps when it is present. + // The native debugger is not harmed by the presence of this information. + MDRawAirbagInfo airbag_info; + airbag_info.validity = MD_AIRBAG_INFO_VALID_DUMP_THREAD_ID | + MD_AIRBAG_INFO_VALID_REQUESTING_THREAD_ID; + airbag_info.dump_thread_id = GetCurrentThreadId(); + airbag_info.requesting_thread_id = requesting_thread_id; + + MINIDUMP_USER_STREAM airbag_info_stream; + airbag_info_stream.Type = MD_AIRBAG_INFO_STREAM; + airbag_info_stream.BufferSize = sizeof(airbag_info); + airbag_info_stream.Buffer = &airbag_info; + + MINIDUMP_USER_STREAM_INFORMATION user_streams; + user_streams.UserStreamCount = 1; + user_streams.UserStreamArray = &airbag_info_stream; // The explicit comparison to TRUE avoids a warning (C4800). success = (minidump_write_dump_(GetCurrentProcess(), @@ -197,7 +217,7 @@ bool ExceptionHandler::WriteMinidumpWithException(DWORD requesting_thread_id, dump_file, MiniDumpNormal, exinfo ? &except_info : NULL, - NULL, + &user_streams, NULL) == TRUE); CloseHandle(dump_file); -- cgit v1.2.1