某些C ++库在出现错误时调用abort()函数(例如,SDL)。在这种情况下,没有提供有用的调试信息。无法捕获中止调用并写入一些诊断日志输出。我想在不重写/重建这些库的情况下全局覆盖此行为。我想抛出异常并处理它。有可能吗?
答案 0 :(得分: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);
如果您无法阻止abort
调用(例如,它们是由于尽管您的最佳意图而导致的错误),这可能允许您收集更多调试信息。这是可移植的ANSI C,因此它也可以在Unix和Windows以及其他平台上运行,但是在中止处理程序中执行的操作通常不可移植。请注意,当assert
失败时,或者甚至是其他运行时函数(例如,如果malloc
检测到堆损坏)时,也会调用此处理程序。因此,在该处理程序中,您的程序可能处于疯狂状态。你不应该分配内存 - 如果可能的话使用静态缓冲区。只需尽量减少收集所需信息,向用户收到错误消息,然后退出。
某些平台可能允许进一步自定义abort
个功能。例如,在Windows上,Visual C ++有一个函数_set_abort_behavior
,可让您选择是否向用户显示消息,以及是否收集故障转储。
答案 1 :(得分:3)
根据Linux上的手册页,abort()会为可由信号处理程序捕获的进程生成SIGABRT。编辑:Ben的确认这在Windows上也是可能的 - 请参阅下面的评论。
答案 2 :(得分:0)
您可以尝试编写自己的代码并让链接器代替std :: abort调用您的代理。我不确定是否可能。