Index: src/client/windows/handler/exception_handler.cc |
=================================================================== |
--- src/client/windows/handler/exception_handler.cc (revision 596) |
+++ src/client/windows/handler/exception_handler.cc (working copy) |
@@ -550,6 +550,8 @@ |
// static |
void ExceptionHandler::HandlePureVirtualCall() { |
+ // This is an pure virtual funciton call, not an exception. It's safe to |
+ // play with sprintf here. |
AutoExceptionHandler auto_exception_handler; |
ExceptionHandler* current_handler = auto_exception_handler.get_handler(); |
@@ -557,6 +559,26 @@ |
memset(&assertion, 0, sizeof(assertion)); |
assertion.type = MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL; |
+ // Make up an exception record for the current thread and CPU context |
+ // to make it possible for the crash processor to classify these |
+ // as do regular crashes, and to make it humane for developers to |
+ // analyze them. |
+ EXCEPTION_RECORD exception_record = {}; |
+ CONTEXT exception_context = {}; |
+ EXCEPTION_POINTERS exception_ptrs = { &exception_record, &exception_context }; |
+ RtlCaptureContext(&exception_context); |
+ exception_record.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION; |
+ |
+ // We store pointers to the the expression and function strings, |
+ // and the line as exception parameters to make them easy to |
+ // access by the developer on the far side. |
+ exception_record.NumberParameters = 3; |
+ exception_record.ExceptionInformation[0] = |
+ reinterpret_cast<ULONG_PTR>(&assertion.expression); |
+ exception_record.ExceptionInformation[1] = |
+ reinterpret_cast<ULONG_PTR>(&assertion.file); |
+ exception_record.ExceptionInformation[2] = assertion.line; |
+ |
bool success = false; |
// In case of out-of-process dump generation, directly call |
// WriteMinidumpWithException since there is no separate thread running. |
@@ -564,10 +586,11 @@ |
if (current_handler->IsOutOfProcess()) { |
success = current_handler->WriteMinidumpWithException( |
GetCurrentThreadId(), |
- NULL, |
+ &exception_ptrs, |
&assertion); |
} else { |
- success = current_handler->WriteMinidumpOnHandlerThread(NULL, &assertion); |
+ success = current_handler->WriteMinidumpOnHandlerThread(&exception_ptrs, |
+ &assertion); |
} |
if (!success) { |