gpt4 book ai didi

C++ 中止重写

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:55 34 4
gpt4 key购买 nike

某些 C++ 库会在出错时调用 abort() 函数(例如 SDL)。在这种情况下没有提供有用的调试信息。无法捕获中止调用并写入一些诊断日志输出。我想在不重写/重建这些库的情况下全局覆盖此行为。我想抛出异常并处理它。可能吗?

最佳答案

请注意,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这让您可以选择是否向用户显示消息,以及是否收集故障转储。

关于C++ 中止重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45259288/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com