| 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) {
|
|
|