在C ++中捕获Segfault或任何其他错误/异常/信号,例如在Java中捕获异常

时间:2011-05-15 12:52:30

标签: c++ exception exception-handling segmentation-fault signals

我写了一个基于有缺陷的开源库的Linux程序。该库有时会触发我无法控制的段错误。当然,一旦图书馆有段错误,整个程序就会死掉。但是,即使库有段错误,我也必须确保我的程序继续运行。这是因为我的程序类似于“服务器”,它至少需要告诉客户一些不好的事情,并从错误中恢复,而不是鸡蛋......有没有办法做到这一点?

我理解在Java中只需要捕获异常。但是C ++如何处理这个呢?

[更新]我知道C ++中也存在异常处理,但Segfault也不例外,是吗?当segfault发生时我不认为会抛出任何东西。据我所知,你必须明确地“抛出”使用try .... catch ....

非常感谢,我对C ++很陌生。

5 个答案:

答案 0 :(得分:14)

分段违规后,您无法reliably恢复执行。如果您的程序必须保持运行,请在单独的进程中对违规库进行隔离,并通过管道与其进行通信。当违反分段时,您的程序会注意到已关闭的管道。

答案 1 :(得分:4)

不幸的是,你不能让程序继续下去。导致SIGSEGV的错误代码通常会触发未定义的行为,例如解除引用空指针或读取垃圾内存。如果您的代码对无效数据进行操作,则无法继续。

您可以处理信号,但您可以做的最多就是转储堆栈跟踪并死掉。

C和C ++是inherently unsafe,您无法处理由未定义行为触发的错误并让程序继续运行。

答案 2 :(得分:3)

您可以使用信号处理程序。但这并不是真的值得推荐,因为你不能保证你已经消除了问题的原因。最好的办法是在一个单独的过程中隔离它 - 这就是谷歌Chrome的方法。

如果是FOSS,最简单的方法就是调试它。

答案 3 :(得分:2)

如果您有权访问源代码,那么在像GDB这样的调试器中运行程序员可能会很有用。 GDB在导致段错误的行停止。

如果你真的想捕获信号,你需要使用the signal system call连接一个信号处理程序。我可能会坚持使用调试器。

编辑: 既然你写了段segfaults,我只想指出the first rule of programming: It's always your fault。特别是如果您是C ++的新手,可能会发生段错误,因为您以某种方式错误地使用了库。 C ++是一种非常微妙的语言,很容易做你不想做的事情。

答案 4 :(得分:0)

here所述,您无法捕获带有try块的段错误信号或将段违规“映射”到任何内容。亲自处理SIGSEGV是一个非常糟糕的主意。来自C ++代码的SEGV是严重错误。您可以使用gdb找出原因并解决。