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.
StackWalk64
from within the global exception-handler. – Greenes