【问题标题】:Catch Segfault or any other errors/exceptions/signals in C++ like catching exceptions in Java在 C++ 中捕获 Segfault 或任何其他错误/异常/信号,例如在 Java 中捕获异常
【发布时间】:2011-08-25 21:26:45
【问题描述】:

我基于一个有缺陷的开源库编写了一个 Linux 程序。这个库有时会触发我无法控制的段错误。当然,一旦库出现段错误,整个程序就会死掉。但是,即使库有段错误,我也必须确保我的程序继续运行。这是因为我的程序有点像“服务器”,它至少需要告诉客户发生了不好的事情并从错误中恢复,而不是退缩......有什么办法吗?

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

[更新]我知道 C++ 中也有异常处理,但是 Segfault 不是异常,是吗?我认为发生段错误时不会抛出任何东西。你必须明确地“抛出”一些东西来使用 try.... catch.... 据我所知。

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

【问题讨论】:

  • Google 是你的朋友 -> cplusplus.com/doc/tutorial/exceptions :)
  • 嗨,卡洛斯。我理解这部分,但 Segfault 也不例外,是吗?我认为发生段错误时不会抛出任何东西。你必须明确地“抛出”一些东西来使用 try.... catch.... 据我所知。
  • 有人为共同利益编写了开源库。您是需要它才能让您的程序正常工作的人。不幸的是,它包含使您的程序崩溃的缺陷(或一对)。那么为什么要寻找绕过缺陷的方法呢?你不能追踪并修复缺陷吗?解决缺陷总是比修复它们更难。您还可以将修复补丁发送给库的作者,从而使我们的世界变得更美好。

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


【解决方案1】:

您不能reliably 在分段违规后恢复执行。如果您的程序必须保持运行,请在单独的进程中隔离有问题的库并通过管道与其通信。当它发生分段违规时,您的程序会注意到关闭的管道。

【讨论】:

    【解决方案2】:

    很遗憾,您无法让程序继续运行。导致 SIGSEGV 的错误代码通常会触发未定义的行为,例如取消引用空指针或读取垃圾内存。如果您的代码对无效数据进行操作,您将无法继续。

    您可以处理信号,但您最多只能转储堆栈跟踪并死掉。

    C和C++是inherentlyunsafe,你不能处理由未定义行为触发的错误,让程序继续运行。

    【讨论】:

      【解决方案3】:

      您可以使用信号处理程序。但实际上并不建议这样做,因为您不能保证您已经消除了问题的原因。最好的办法是将其隔离在一个单独的进程中 - 这是 Google Chrome 采用的方法。

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 感谢您的回复。有什么理由不推荐信号处理程序吗?我只想让我的程序运行,因为它是一个需要免疫的服务器端程序。我非常喜欢破解底层库,只是我不够好。 =(人们如何处理这种情况(当服务器需要继续运行时)。
        • 原因是您通常希望找到错误并修复它,在这种情况下,编写信号处理程序可能比它的价值更麻烦。由于输入无效,库可能会出现段错误,因此您应该找出发生了什么并避免它,而不是尝试在运行时修复它。
        • 一个很好的答案 (+1),但 sigactionsignal 更受欢迎。
        【解决方案5】:

        正如here 中提到的,您无法使用 try 块捕获段错误信号或将段违规“映射”到任何内容。自己处理 SIGSEGV 真是个坏主意。 C++ 代码中的 SEGV 是一个严重错误。您可以使用 gdb 找出原因并解决它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-21
          • 2010-12-14
          • 1970-01-01
          • 1970-01-01
          • 2011-07-02
          • 2021-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多