1

我希望程序何时以及是否会失败,而不是在此处理程序中捕获它以执行一些警卫通知。

是否有我需要注册的底部处理程序或处理程序列表,以确保程序在不通过我的处理程序的情况下不会崩溃?

在 ubuntu 上运行,只需要 ubuntu 的解决方案我需要各种失败,比如异常内存分配......

4

7 回答 7

2

C++ 不在虚拟沙箱中运行,因此该语言没有任何内置功能可以捕捉到这一点。您当然可以自己构建一个(例如使用异常),但由您的代码从基础构建它。

你运行的平​​台可能有一些你可以使用的东西。例如在 Windows 中有SetUnhandledExceptionFilter.

当然,这一切仍然取决于“崩溃”是什么意思。

于 2012-08-24T13:29:15.167 回答
2

在进程启动时,调用fork. 使用父母来监视孩子。如果遇到致命错误,该进程将消失。您可以检测到这一点,并在发生这种情况时做任何您需要做的事情。如果孩子希望正常终止,它可以在终止之前简单地杀死它的父母。

于 2012-08-24T13:33:10.297 回答
2

对于正常的程序退出,您可以使用std::atexit().

对于由于未捕获的异常而退出的程序/...您可以使用std::set_terminate. 如果“异常内存分配”是指std::bad_alloc异常,则应触发此处理程序。

于 2012-08-24T13:33:37.987 回答
2

简单的答案是,没有一个点可以处理程序中的所有错误。您可以添加一个try/catch (...)at来处理在输入之后和完成之前main发生的异常。main您还可以terminate在 C++ 中添加处理程序。然后根据操作系统,您还需要以不同方式处理其他情况(可以通过处理 SIG_SEGV 在 unix/linux 中处理无效的内存引用,但这在 Windows 中不起作用——AFAIK;一些其他错误可能会触发不同的信号,这些信号可能或不被处理...)除此之外,可能仍然存在未被注意到的错误(例如碰巧命中有效内存地址的无效内存访问...程序将不正确,但错误可能未被检测到)

于 2012-08-24T13:33:56.853 回答
1

在 Linux 中你需要响应SIGABRTSignal。每当您的应用收到 SIGABRT 信号时,您callback都会被调用

signal(SIGABRT, &callback);

对于不同的场景有不同的信号,例如SIGSEGVSIGBUS您需要挂钩。你最好将它们挂在不同的回调中并检查哪个错误进入了什么。因为一个错误可能是由于多个问题引起的。

于 2012-08-24T13:29:45.797 回答
0

不会。例如,如果进程kill带有,则不会运行任何处理程序。SIGKILL

PS 仅供参考,这与SPOF无关。

于 2012-08-24T13:27:11.453 回答
0

您可以将try/catch(...)块放在顶层以捕获所有异常。但是还有其他方法可以终止程序,并且捕获这些方法的方法不可移植。在基于 Unix 的系统上,您必须创建信号处理程序,但即使是那些也不会停止kill -9

于 2012-08-24T13:30:02.013 回答