是否可以绕过或捕获“分段故障”

时间:2014-12-09 22:59:44

标签: c++ c

我使用外部库(xqilla)进行c ++,其结果是某些uri的分段错误,有些则没有。我对整个C世界都有点新意,我猜不可能把它当成例外,但是我需要问一下它是否可能。任何其他解决方案当然也会受到欢迎。

那么有一种替代方法可以尝试捕获"分段错误"错误?

3 个答案:

答案 0 :(得分:7)

如果您在调试器中运行程序,它会告诉您哪些指令导致了有问题的内存访问,以便您可以修复它。

或者,您可以通过signal(2)sigaction(2)添加信号处理程序,但是以这种方式调试的能力可能会非常困难。发生此类故障后,您的程序状态可能无法预测。

答案 1 :(得分:3)

如果您收到第三方库的分段错误,您应首先缩小问题的范围,并确保该错误位于您的程序而不是库中。如果它是库的错误,您可以通过向维护者报告错误或搜索邮件列表,文档等来节省大量的浪费。

一旦你完成了这个并决定调试你的程序,捕获“分段错误”并不是你想要做的。此时 1 的行为未定义。您应该使用-g进行编译(如果在GCC或Clang上)以生成调试信息并使用调试器运行它。有几种工具可以帮助您捕获和修复错误:

  • GCC和Clang的警告选项,-Wall -Wextra -pedantic
  • LLVM's sanitizer,存在于GCC和Clang中。特别是,您可以试用-fsanitize=undefined,address,leak 2
  • GNU的调试器,gdb
  • Valgrind

通过遵循修复程序的正常路线而不是以反向方式,您将节省大量精力。


1)来源:Segmentation fault handling

2)不要同时运行valgrind和消毒剂。一些消毒杀菌剂也是相互排斥的。

答案 2 :(得分:2)

我并不熟悉xquilla,但“分段错误”正式表明程序试图访问尚未分配给它的内存地址。极少数例外(例如,完全模拟不同的计算机),这表明程序中存在灾难性的错误。通过仔细操作输入,可能会使程序以任意恶意的方式行为不当,而不仅仅是崩溃。

您的最佳选项是废弃此库并找到执行相同工作但错误较少的库。

如果这不是一个选项,那么您的第二个最佳选择是在一个单独的进程中隔离该库,在一个“沙箱”中运行,以防止它在崩溃或被恶意软件接管时损坏任何内容。然后,您的应用程序的其余部分将检测崩溃,清理并继续。不幸的是,编写这样的沙箱很难,我不知道你可以使用任何现成的代码。祝你好运!