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.