top*_*dev 5 c++ exception-handling abort
某些C++库在出现错误时调用abort()函数(例如,SDL).在这种情况下,没有提供有用的调试信息.无法捕获中止调用并写入一些诊断日志输出.我想在不重写/重建这些库的情况下全局覆盖此行为.我想抛出异常并处理它.可能吗?
Dou*_*oug 17
注意,abort提升SIGABRT信号,就好像它被调用一样raise(SIGABRT).您可以安装在这种情况下调用的信号处理程序,如下所示:
#include <signal.h>
extern "C" void my_function_to_handle_aborts(int signal_number)
{
/*Your code goes here. You can output debugging info.
If you return from this function, and it was called
because abort() was called, your program will exit or crash anyway
(with a dialog box on Windows).
*/
}
/*Do this early in your program's initialization */
signal(SIGABRT, &my_function_to_handle_aborts);
Run Code Online (Sandbox Code Playgroud)
如果你无法阻止这些abort调用(比如,它们是由于尽管你最好的意图而导致的错误),这可能会让你收集更多的调试信息.这是可移植的ANSI C,因此它也可以在Unix和Windows以及其他平台上运行,但是在中止处理程序中执行的操作通常不可移植.请注意,当assert失败时,或者甚至是其他运行时函数(例如,如果malloc检测到堆损坏)时,也会调用此处理程序.因此,在该处理程序中,您的程序可能处于疯狂状态.你不应该分配内存 - 如果可能的话使用静态缓冲区.只需尽量减少收集所需信息,向用户收到错误消息,然后退出.
某些平台可以允许其abort功能进一步定制.例如,在Windows上,Visual C++具有一个功能_set_abort_behavior,允许您选择是否向用户显示消息,以及是否收集故障转储.