【问题标题】:How to "ignore" segfault in cpp?如何“忽略”cpp中的段错误?
【发布时间】:2018-11-07 07:42:13
【问题描述】:

所以,这个问题可能听起来很奇怪,但让我解释一下: 我用 C++ 编写了一个代码来分析一些数据,这些数据在文件中分开。我将这些文件的名称(其中有很多)作为参数传递给程序。 也许我在代码中犯了一些错误,或者其中一些文件中的数据不是“好”的,现在这并不重要。但是对于某些文件,程序会停止并返回一个段错误消息。 有一种方法可以仅使用 C++ 将段错误跳转到参数列表中的下一个文件?

也许我可以使用一些 shell 脚本为每个文件运行它,然后,如果我遇到段错误,它会继续一个一个地运行。但这不是我现在想要的,如果我不能解决这个问题,我会尝试这种方式。

提前谢谢你们。

【问题讨论】:

  • 问题是段错误(或其原因)可能会使您的程序、运行时支持库或两者都处于不一致状态。如果您继续,忽略段错误,您将无法信任任何后续结果。
  • 要么编辑您的程序以修复段错误,要么使用 shell 脚本调用具有不同参数的命令。
  • 操作系统?这真的不能以独立于操作系统的方式完成。但是你开始一个单独的过程的想法是最干净的解决方案。它为操作系统提供了一种封装和隔离故障的方法。是否通过 shell、CreateProcess() 或 fork() 启动其他进程取决于您的具体情况。
  • 也许我的代码有错误 -- 注意失败可能源于你认为没问题的代码,分段错误只是一个症状以前的错误代码。那么如果你的程序有这样的段错误,那么它的可靠性如何呢?隔离坏文件或坏数据,重现段错误(这应该是第一件事),并修复错误。至于启动新流程——如果发现您每天或每周发生数百次分段故障怎么办?在某些时候,启动新流程的临时工作可能不可行。

标签: c++ segmentation-fault arguments parameter-passing


【解决方案1】:

可以事实上为SIGSEGV(在大多数类似Unix的操作系统上)安装一个信号处理程序,当您的程序遇到段错误时调用它,如果您愿意可以以任何看起来合适的方式处理它(包括忽略它)。这样做是非常深奥的(java 会这样做,但这是我见过的唯一 semi-sane 用法)而且很少是正确的做法,并且在这样的情况下正确处理错误处理程序是困难,因为您无法确定是什么导致了故障以及从信号处理程序返回后程序的状态。

所以,虽然您可以“处理”SIGSEGV,但我建议您转而研究其他方法来清理您的输入数据,以便一开始就避免段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多