困扰好久的问题。
有几种方法可以定位崩溃,第一种是通过崩溃地址和.cod文件,来查找。
还有一种是生成.dmp文件,来查找。但是STL崩溃直接弹出windows的窗口的。
setunhandleexception 无法捕捉到?你们是怎么弄的?STL使用是方便,但是我觉得这个新手用的话,会把程序搞的啥时候宕掉都不知道。

解决方案 »

  1.   

    通常是迭代器失效,还有在空容器上作了一些操作会造成crash
      

  2.   

    SetUnhandledExceptionFilter()函数实质是设置全局异常处理钩子函数,理论上任何线程如果异常没有被处理,都会调用该函数设置的filter的。如果没有捕获到,可能是因为该异常已经被调试器或者代码处理了,且处理的代码中调用了ExitProcess()或TerminateProcess()之类的函数直接退出了。
      

  3.   

    可以建个工程试一下。。新建的工程。没有任何的抓异常。就相当于类似的代码std::vector<int > vecInt;
    vecInt[0] = 1;it = vecint.begin();
    vecint.erase(it);
    vecint.erase(it);这样就会有一个异常。但是抓不到?Why?
      

  4.   

    抓不到异常还是因为我说的状况,被msvcrt.dll的代码处理掉了。见异常时的调用堆栈:(vs2008 win7 32bit)
    ChildEBP RetAddr  
    0012fb9c 75792467 ntdll!ZwTerminateProcess
    0012fbac 6e15cc4e KERNELBASE!TerminateProcess+0x2c
    0012fee8 6e15ccd5 MSVCR90!_invoke_watson+0x11b [f:\dd\vctools\crt_bld\self_x86\crt\src\invarg.c @ 234]
    0012ff00 0040194c MSVCR90!_invalid_parameter_noinfo+0xc [f:\dd\vctools\crt_bld\self_x86\crt\src\invarg.c @ 125]
    0012ff0c 00401b90 API_test!std::vector<int,std::allocator<int> >::erase+0x4c [c:\program files\microsoft visual studio 9.0\vc\include\vector @ 1022]
    0012ff44 00401df1 API_test!main+0x120 [d:\projects\vc projects(backup)\home\try\api_test\api_test.cpp @ 1356]
    0012ff88 77561194 API_test!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 586]
    0012ff94 7741b429 kernel32!BaseThreadInitThunk+0xe
    0012ffd4 7741b3fc ntdll!__RtlUserThreadStart+0x70
    0012ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
      

  5.   

    TO:aiwnx  恩,应该是这样。现在我想弄一个假如异常的话给自己发邮件。类似于CrashRport那个开源代码样的。
    那个代码应该也是抓不到的。这个有办法吗?TO:ysjyniiq
    我知道在调试的时候能看到调用堆栈的。我需要的是Release版本下。在用户使用的时候出现异常。我能够得到反馈
      

  6.   

    STL一般是不会崩溃的,往往是你自己错误的使用了STL。
      

  7.   

    由于vc对属于STL本身的异常在msvcrt库中进行了封装和处理,所有想抓到的话只有hook msvcrt库中导出的_invoke_watson或者_invalid_parameter了ps:查看vc9的_invoke_watson()函数源码时发现它对SetUnhandledExceptionFilter()设置的全局钩子做了还原处理,所以更加不会引发自定义的未处理异常了。...
        ExceptionRecord.ExceptionCode = STATUS_INVALID_CRUNTIME_PARAMETER;
        ExceptionRecord.ExceptionFlags    = EXCEPTION_NONCONTINUABLE;
        ExceptionRecord.ExceptionAddress = _ReturnAddress();
        wasDebuggerPresent = IsDebuggerPresent();    /* Make sure any filter already in place is deleted. */
        SetUnhandledExceptionFilter(NULL);    ret = UnhandledExceptionFilter(&ExceptionPointers);    // if no handler found and no debugger previously attached
        // the execution must stop into the debugger hook.
        if (ret == EXCEPTION_CONTINUE_SEARCH && !wasDebuggerPresent) {
            _CRT_DEBUGGER_HOOK(_CRT_DEBUGGER_INVALIDPARAMETER);
        }    TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER);
      

  8.   

    但是你不能说是STL崩溃了,如果你跟进一个函数发现是在kernel32.dll里面崩溃了,你是不是说kernel32.dll里面的某个函数就有问题了?