What actions do I need to take to get a crash dump in ALL error scenarios?

前端 未结 6 1051
孤独总比滥情好
孤独总比滥情好 2021-02-04 09:39

We\'re on Windows and we want to get a crash dump (possibly using MiniDumpWriteDump) for all scenarios where our application exit\'s unexpectedly.

6条回答
  •  难免孤独
    2021-02-04 10:06

    Tall order, just in brief:

    • You need not to use any other _set* functions, SetUnhandledExceptionFilter is enough for all.
    • C runtime functions like abort will disable the global exception handler, which you setup using SetUnhandledExceptionFilter. CRT will simply call this same function will NULL parameter, and your exception-handler is disabled (not called), if CRT is causing crash! What you can do? [X]
    • Disable all other running threads when the excption-handler gets called. Just lookup all threads using CreateToolhelp32Snapshot, and other functions. Look for this process, and suspend all other running threads (except current, ofcourse).
    • Use SEH or no-SEH, global-exception handler gets called unless CRT interfers. Not to worry (in MOST cases).
    • Do not any CLR in-between, it will not allow the exception handler to call, if any CLR/managed call (yes from C/C++) comes in between.
    • You cannot handle one exception - Stack Overflow! Think! Running under a debugger is only solution, see below.

    There is more to it, which I haven't tried (not found usefulness) - Vectored Exception Handling.

    One other approach is to run the application into a debugger, which you can craft yourself! In the debugger, you can catch ALL exceptions, just like VS debugger catches. See my article. But, you know, this is not proper approach.

    EDIT: Just read the last content about process-termination. You shouldn't control that. In any case, you can just hook the required APIs, which would act as what you code for (like displaying message box).

    [X] You need to use API hooking. I dont have link and details handy. You'd hook other related APIs, but primarily the SetUnhandledExceptionFilter (after you'd called it for you). You dummy (hooked) function will look like:

    xxx SetUnhandledExceptionFilter_DUMMY(xxx)
    {
      // Dont do any thing
      return NULL;
    }
    

    I dont have link and details of API hooking handy.


    And why not attempt to make your application more safe?

    • Correct all warnings (yes, even level 4).
    • Use static analysis. VS itself has (in higher versions, though. Except 2012 - all variants have). Other SA tools are available.
    • Do careful code-reviewing. It pays!
    • Run and Debug your RELEASE build from the debugger. Use all features.
    • Look and correct all possible memory leaks.
    • Use defensive approach to programming. Rather than checking if null, defend it using ASSERT, or your own assert. Pack it with assertion, log, return from function.

提交回复
热议问题