【问题标题】:Why aren't we given more information about Segmentation Fault during runtime? [closed]为什么我们没有在运行时提供有关分段错误的更多信息? [关闭]
【发布时间】:2018-11-04 00:54:32
【问题描述】:

每当我收到Segmentation Fault 错误时,我就知道我正在某个地方访问“不属于我”的内存。

在一些不明显的情况下,我不得不依赖调试工具,例如分析器(例如 Valgrind)。

不幸的是,在运行时,我只收到以下错误消息:

分段错误

没有别的了。我的问题是:


为什么程序在运行时不提供有关错误的更多信息?


Ps:这不是关于为什么会发生分段错误错误的问题:我明白为什么。

【问题讨论】:

  • 这是因为计算机明显是愚蠢的。由您来破译实际出了什么问题。对此感到高兴,因为这可以挽救您的工作,并且仍然需要有人来照顾它。
  • 许多编译器现在包含额外的工具来帮助搜索泄漏 (example) 和其他可能令人讨厌的情况。首先,启动并且永远不要忽略编译器警告。
  • 操作系统自带工具。我只知道 MS,那个工具就是 Watson。它将记录堆栈的状态等。它会生成一个文件,您可以将该文件带回您的开发系统并启动调试器。它在过去让我头疼。
  • 感谢@user2079303 指出这一点。投反对票的人,请说明为什么投反对票,以便我将来可以提出更好的问题。特别是对于这一点,我进行了研究,我能找到的只是“为什么”而不是“为什么不提供更多信息”。
  • FWIW,MacOS/X 有一个相对有用的崩溃例程——当你的程序崩溃时,会出现一个对话框,让用户可以选择查看崩溃报告(其中包括有用的调试信息,如堆栈跟踪显示崩溃线程的崩溃位置,以及其他线程当时正在做什么)。您甚至可以选择将崩溃报告邮寄给 Apple,尽管我从未见过任何有用的结果:/

标签: c++ segmentation-fault


【解决方案1】:

不,您不能,因为段错误不是由您的程序报告的,而是由您的操作系统在 CPU 级别接收trap 报告的(这是一种例外)。此时,CPU 认为您的程序不可恢复并告诉操作系统停止它。您的程序只能关闭,因为 CPU 发出了该命令。

【讨论】:

  • 有趣,我不知道。
  • Weeellll,您的程序可以捕捉信号并尝试生存,但它可能无法做到。当系统告诉您程序的 toast 时,相信它符合您的最大利益。也许您可以收集一些信息,但您在信号处理程序中的选择非常有限。
  • @user4581301 实际上已经考虑了一段时间。操作系统可以尝试恢复我的程序吗?因为陷阱只会在某个时候设置程序计数器,然后操作系统会接管。也许如果操作系统关心,它不会关闭我的程序并尝试做某事?我不知道。我知道陷阱的东西,因为我编写了模拟器并模拟了 MMU。但我从来没有写过操作系统内核。
  • @user4581301 POSIX 标准说,如果信号处理程序从 SIGSEGV 正常返回,则进程的行为是未定义的,因此如果进程存活,您无法知道之后的任何输出或副作用是否有用,或可能会损坏您的数据。即使没有,该结果也不能移植到其他系统。
  • 可以配置 *nix 系统以提供核心转储,这对于 gdb stackoverflow.com/questions/17965/… 非常有用
猜你喜欢
  • 2014-11-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多