设置全局异常处理。SetUnhandledExceptionFilter返回非0,表示成功。
线程类中一段测试代码:
{
CA* p;
delete p;  //异常
}
然而,全局异常函数没有捕捉到这个异常。程序照样运行。我晕!
测试代码改成:
{
int k = 0;
int j = 9;
int m = j / k;  //异常
}
仍然捕捉不到。请问是什么原因?

解决方案 »

  1.   

    VS2008 SP1新建默认解决方案,测试Debug和Release下都工作正常啊:LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
    {
    std::cout << "UnhandledExceptionFilter" << std::endl;
    return EXCEPTION_CONTINUE_SEARCH;
    }int _tmain(int argc, TCHAR* argv[])
    {
    SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter); int* p;
    delete p;
    std::cout << p << std::endl;
    //int k = 0;
    //int j = 9;
    //int m = j / k; //异常
    //std::cout << m << std::endl;
    return 0;
    }
      

  2.   


    在线程里也正常,输出你的指针的值看看是不是为0,是的话就给指针赋一个非0的初始值再试试,因为delete 0是合法的:
    #include <iostream>
    #include <tchar.h>
    #include <Windows.h>LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
    {
    std::cout << "UnhandledExceptionFilter" << std::endl;
    return EXCEPTION_CONTINUE_SEARCH;
    }DWORD CALLBACK Thread(LPVOID lpParam)
    {
    // 禁用异常对话框
    //_CrtSetReportMode(_CRT_ASSERT, 0);
    //_CrtSetReportMode(_CRT_ERROR, 0);
    //_CrtSetReportMode(_CRT_WARN, 0); //测试1
    int* p = (int*)1;
    delete p;
    std::cout << p << std::endl;
    //测试2
    //int k = 0;
    //int j = 9;
    //int m = j / k; //异常
    //std::cout << m << std::endl; return 0;
    }int _tmain(int argc, TCHAR* argv[])
    {
    SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter);
    CreateThread(NULL, 0, &Thread, NULL, 0, NULL); _tsystem(_T("pause"));
    return 0;
    }Release下捕获不到测试1,但程序也没出错,可能是代码太简单被编译器优化掉了。.
      

  3.   


    是的,我也奇怪,为什么会被程序忽略掉。
    已经测试出SetUnhandledExceptionFilter可以捕捉线程异常。之前捕捉不到,就是因为程忽略了我造的2个异常。
      

  4.   

    使用VS2005(VC8)+编译的程序,许多错误都不能在SetUnhandledExceptionFilter捕获到
    void DisableSetUnhandledExceptionFilter()
    {
        void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter");
    if (addr) 
    {
    unsigned char code[16];
    int size = 0;
    code[size++] = 0x33;
    code[size++] = 0xC0;
    code[size++] = 0xC2;
    code[size++] = 0x04;
    code[size++] = 0x00;
    DWORD dwOldFlag, dwTempFlag;
    VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
    WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
    VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
    }
    }