我希望程序何时以及是否会失败,而不是在此处理程序中捕获它以执行一些警卫通知。
是否有我需要注册的底部处理程序或处理程序列表,以确保程序在不通过我的处理程序的情况下不会崩溃?
在 ubuntu 上运行,只需要 ubuntu 的解决方案我需要各种失败,比如异常内存分配......
我希望程序何时以及是否会失败,而不是在此处理程序中捕获它以执行一些警卫通知。
是否有我需要注册的底部处理程序或处理程序列表,以确保程序在不通过我的处理程序的情况下不会崩溃?
在 ubuntu 上运行,只需要 ubuntu 的解决方案我需要各种失败,比如异常内存分配......
C++ 不在虚拟沙箱中运行,因此该语言没有任何内置功能可以捕捉到这一点。您当然可以自己构建一个(例如使用异常),但由您的代码从基础构建它。
你运行的平台可能有一些你可以使用的东西。例如在 Windows 中有SetUnhandledExceptionFilter
.
当然,这一切仍然取决于“崩溃”是什么意思。
在进程启动时,调用fork
. 使用父母来监视孩子。如果遇到致命错误,该进程将消失。您可以检测到这一点,并在发生这种情况时做任何您需要做的事情。如果孩子希望正常终止,它可以在终止之前简单地杀死它的父母。
对于正常的程序退出,您可以使用std::atexit()
.
对于由于未捕获的异常而退出的程序/...您可以使用std::set_terminate
. 如果“异常内存分配”是指std::bad_alloc
异常,则应触发此处理程序。
简单的答案是,没有一个点可以处理程序中的所有错误。您可以添加一个try/catch (...)
at来处理在输入之后和完成之前main
发生的异常。main
您还可以terminate
在 C++ 中添加处理程序。然后根据操作系统,您还需要以不同方式处理其他情况(可以通过处理 SIG_SEGV 在 unix/linux 中处理无效的内存引用,但这在 Windows 中不起作用——AFAIK;一些其他错误可能会触发不同的信号,这些信号可能或不被处理...)除此之外,可能仍然存在未被注意到的错误(例如碰巧命中有效内存地址的无效内存访问...程序将不正确,但错误可能未被检测到)
在 Linux 中你需要响应SIGABRT
Signal。每当您的应用收到 SIGABRT 信号时,您callback
都会被调用
signal(SIGABRT, &callback);
对于不同的场景有不同的信号,例如SIGSEGV
,SIGBUS
您需要挂钩。你最好将它们挂在不同的回调中并检查哪个错误进入了什么。因为一个错误可能是由于多个问题引起的。
不会。例如,如果进程kill
带有,则不会运行任何处理程序。SIGKILL
您可以将try
/catch(...)
块放在顶层以捕获所有异常。但是还有其他方法可以终止程序,并且捕获这些方法的方法不可移植。在基于 Unix 的系统上,您必须创建信号处理程序,但即使是那些也不会停止kill -9
。