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
This commit is contained in:
parent
fe82bf24a9
commit
5ac32b6534
@ -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);
|
||||
|
@ -294,6 +294,10 @@
|
||||
RelativePath="..\..\..\common\windows\guid_string.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\google_airbag\common\minidump_format.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
|
@ -71,6 +71,14 @@
|
||||
#include "google_airbag/common/airbag_types.h"
|
||||
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
/* Disable "zero-sized array in struct/union" warnings when compiling in
|
||||
* MSVC. DbgHelp.h does this too. */
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4200)
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
|
||||
/*
|
||||
* guiddef.h
|
||||
*/
|
||||
@ -483,7 +491,10 @@ typedef enum {
|
||||
MD_FUNCTION_TABLE_STREAM = 13,
|
||||
MD_UNLOADED_MODULE_LIST_STREAM = 14,
|
||||
MD_MISC_INFO_STREAM = 15, /* MDRawMiscInfo */
|
||||
MD_LAST_RESERVED_STREAM = 0x0000ffff
|
||||
MD_LAST_RESERVED_STREAM = 0x0000ffff,
|
||||
|
||||
/* Airbag extension types. 0x4767 = "Gg" */
|
||||
MD_AIRBAG_INFO_STREAM = 0x47670001 /* MDRawAirbagInfo */
|
||||
} MDStreamType; /* MINIDUMP_STREAM_TYPE */
|
||||
|
||||
|
||||
@ -963,4 +974,51 @@ typedef enum {
|
||||
} MDMiscInfoFlags1;
|
||||
|
||||
|
||||
/*
|
||||
* Airbag extension types
|
||||
*/
|
||||
|
||||
|
||||
typedef struct {
|
||||
/* validity is a bitmask with values from MDAirbagInfoValidity, indicating
|
||||
* which of the other fields in the structure are valid. */
|
||||
u_int32_t validity;
|
||||
|
||||
/* Thread ID of the handler thread. dump_thread_id should correspond to
|
||||
* the thread_id of an MDRawThread in the minidump's MDRawThreadList if
|
||||
* a dedicated thread in that list was used to produce the minidump. If
|
||||
* the MDRawThreadList does not contain a dedicated thread used to produce
|
||||
* the minidump, this field should be set to 0 and the validity field
|
||||
* must not contain MD_AIRBAG_INFO_VALID_DUMP_THREAD_ID. */
|
||||
u_int32_t dump_thread_id;
|
||||
|
||||
/* Thread ID of the thread that requested the minidump be produced. As
|
||||
* with dump_thread_id, requesting_thread_id should correspond to the
|
||||
* thread_id of an MDRawThread in the minidump's MDRawThreadList. For
|
||||
* minidumps produced as a result of an exception, requesting_thread_id
|
||||
* will be the same as the MDRawExceptionStream's thread_id field. For
|
||||
* minidumps produced "manually" at the program's request,
|
||||
* requesting_thread_id will indicate which thread caused the dump to be
|
||||
* written. If the minidump was produced at the request of something
|
||||
* other than a thread in the MDRawThreadList, this field should be set
|
||||
* to 0 and the validity field must not contain
|
||||
* MD_AIRBAG_INFO_VALID_REQUESTING_THREAD_ID. */
|
||||
u_int32_t requesting_thread_id;
|
||||
} MDRawAirbagInfo;
|
||||
|
||||
/* For (MDRawAirbagInfo).validity: */
|
||||
typedef enum {
|
||||
/* When set, the dump_thread_id field is valid. */
|
||||
MD_AIRBAG_INFO_VALID_DUMP_THREAD_ID = 1 << 0,
|
||||
|
||||
/* When set, the requesting_thread_id field is valid. */
|
||||
MD_AIRBAG_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1
|
||||
} MDAirbagInfoValidity;
|
||||
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning(pop)
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
|
||||
#endif /* GOOGLE_AIRBAG_COMMON_MINIDUMP_FORMAT_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user