【问题标题】:How can I block in my Qt application signal SIGSEGV from cURL library?如何阻止来自 cURL 库的 Qt 应用程序信号 SIGSEGV?
【发布时间】:2017-12-14 18:50:49
【问题描述】:

我的 Qt 应用程序使用 cURL 库发送 HTTP 请求,有时 cURL 发送 SIGSEGV,然后我的应用程序崩溃。 是否可以捕获此信号并防止分段错误?

【问题讨论】:

标签: c++ c qt curl crash


【解决方案1】:

TL;DR:

不要试图阻止或忽略 SIGSEGV。它只会给你带来痛苦。

说明:

SIGSEGV 表示发生了非常糟糕的事情,并且您的程序已进入不允许访问的内存。这意味着您的程序完全被水洗了。

请原谅我的加拿大人。

你的程序坏了。您不能再相信它会以任何理性的方式行事,实际上应该感谢 SIGSEGV 让您知道这一点。尽管您不想看到 SIGSEGV,但它比一个损坏的程序继续运行并吐出虚假信息的替代方案要好得多。

您可以使用信号处理程序捕获 SIGSEGV,但说您确实捕获并尝试处理它。奇怪的是程序会直接回到触发 SIGSEGV 的代码中,并且很可能会在信号处理程序后立即再次引发它。或者做一些其他奇怪的事情。可能会更糟。

使用信号处理程序捕获 SIGSEGV 来尝试输出消息甚至都不值得,因为消息要表达什么? “哦,蓝精灵。发生了非常糟糕的事情。”?

所以,是的,你可以抓住它,但你不能做任何事情来恢复。该程序已经严重损坏,无法继续。这首先要阻止 SIGSEGV,这意味着修复您的代码。

您能做的最好的事情就是确定程序崩溃的原因。最简单的方法是使用whatever debugger came with your development environment 运行您的程序,等待崩溃,然后检查回溯以获取有关程序如何遭遇厄运的提示。

通常可以在此处找到指向Eric Lippert's How to debug small programs 的链接,我想不出一个很好的理由将其忽略。

不过,还有一件事。 cURL 是一个非常可靠的库。很有可能您使用错误或传递了错误信息:死指针、未终止的 C 样式字符串、指向爆炸函数的指针。我先看看你是如何使用 cURL 的。

【讨论】:

    【解决方案2】:

    不,不是。相反,修复错误并以这种方式防止分段错误。大概您的平台提供了某种调试器。

    【讨论】:

      猜你喜欢
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多