Warum SetUnhandledExceptionFilter einige Ausnahmen nicht erfassen kann, AddVectoredExceptionHandler dies jedoch kann

Ich habe ein Problem mit der Funktion festgestellt, die ich an die weitergegeben habeSetUnhandledExceptionFilter wurde nicht aufgerufen, als der Ausnahmecode c0000374 ausgelöst wurde. Aber es funktioniert gut mit dem Ausnahmecode c0000005. Dann habe ich versucht das zu benutzenAddVectoredExceptionHandler Stattdessen wird die Handler-Funktion korrekt aufgerufen, ohne dass das Problem aufgetreten wäre.

Ist es der API-Fehler? Kann ich überall AddVectoredExceptionHandler anstelle von SetUnhandledExceptionFilter verwenden?

Die beiden Funktionen arbeiten korrekt mit

// Exception code c0000005
int* p1 = NULL;
*p1 = 99;

Nur AddVectoredExceptionHandler kann diese Ausnahme erfassen. (Um zu beweisen, dass es nicht von der Laufzeitbibliothek abhängt, lasse ich die Ausnahme manuell aus und das Ergebnis ist dasselbe.)

// Exception code c0000374
RaiseException(0xc0000374, 0, 0, NULL);

Testprogramm.

#include <tchar.h>
#include <fstream>
#include <Windows.h>

LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("VectoredExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}

LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("TopLevelExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}


int _tmain(int argc, _TCHAR* argv[])
{
    AddVectoredExceptionHandler(1, VectoredExceptionHandler);
    SetUnhandledExceptionFilter(TopLevelExceptionHandler);

    // Exception code c0000374
    RaiseException(0xc0000374, 0, 0, NULL);     

    // Exception code c0000005
    // int* p1 = NULL;
    // *p1 = 99;        


    return 0;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage