什么原因会导致C程序崩溃操作系统

4
我最近发现在Windows 8机器上用C语言编写的一个相当大的图像处理程序在特定情况下存在漏洞。不幸的是,这个漏洞会导致我的整个计算机停滞不前,以至于我的唯一选择是拔掉电源(尤其是在远程工作时非常烦人...)
由于它是一个图像处理程序,我不能只是用打印语句来隔离问题所在 - 问题发生在被调用数十亿次的循环中的某个地方,因此添加printf会将速度降到无法接受的水平,需要花费数天才能到达失败的迭代。
因此,如果这个问题太广泛了,我可以理解,因为我不可能列出所有可能引起问题的代码,我只是在问:
C代码在什么情况下会冻结整个操作系统,而不是seg fault或停止程序?
当我搜索这个问题时,我看到了像这样的代码高尔夫问题:
这不是我要求的 - 很明显我在循环中没有写过system("shutdown")
由于我最熟悉Python和Java,所以这个问题与我惯常的经验不同,
  • 除以零会产生段错误。
  • 意外访问略微超出预期数组的内存会导致段错误(有时会在稍后发生)。
  • 访问受保护的内存会导致程序挂起。
  • 堆栈溢出会导致段错误。
  • 对未初始化的指针进行解引用会导致段错误。
这种印象是否错误 - 这些情况是否会导致整个系统崩溃?我漏掉了哪些情况?它是否取决于我的gcc版本或我的权限状态?
我还没有尝试在不同的操作系统上重现它,因为运行整个程序需要一些依赖项。
如果我的唯一选择是坐几天等待程序运行并使用打印语句,或避免奇怪的情况,那么当然可以这样做。我正在寻找查找错误的关键位置。

尝试按下 Ctrl+Shift+ESC 并稍等片刻。一分钟内,任务管理器窗口应该会打开,检查是否有高 CPU 利用率的进程正在运行(你的应用程序?) - xmojmr
一个可能导致整个操作系统非常不响应的问题是由于循环被调用了数十亿次而导致的内存耗尽和页面交换。任何用户应用程序(例如您的应用程序)都可以尝试消耗更多的内存,从而引起页面交换(硬盘 LED 活动指示灯会闪烁)。检查您的 new/delete。这在 Java 中根本不是您必须要做的事情。 - xmojmr
2
不要使用打印语句,而是将调试信息写入文件。虽然在进行数十亿次迭代时仍可能会很慢,但比直接输出到屏幕要快。 - Paul Rooney
1
如果您的C程序导致操作系统崩溃(并且您正在运行常见的桌面/服务器操作系统),那么可能有以下4种情况之一:1. 您的硬件存在缺陷/故障。2. 操作系统内核中存在错误(包括在内核模式下运行的驱动程序)。3. 您正在编写内核代码并使内核崩溃。4. 您正在访问操作系统的低级特权部分并破坏系统(例如,删除操作系统运行的硬盘或杀死系统关键进程)。 - nos
1
@xmojmr 是的,我会的 - 今天我正在其他电脑上测试代码,希望这能帮助我找到问题的根源。 - en_Knight
显示剩余6条评论
2个回答

2
在具有硬件强制用户模式和内核模式之间特权分离以及操作系统正确配置这些机制的现代系统上,你简单地无法从用户模式进程崩溃系统。

这些错误都会被CPU捕获,CPU会调用操作系统中的异常处理程序,这将快速关闭你的系统。

如果我猜测的话,可能是某个硬件正在过热或出现故障:

  • 由于散热片与导热性能差而导致的CPU过热
  • 电源故障/容量不足
  • DIMM故障
  • 硬盘故障
  • CPU故障
  • GPU故障/过热

我曾经见过加密货币挖掘软件使系统崩溃,因为它推动了GPU的极限。当卡锁定/重置时,驱动程序会变得混乱或锁定,系统最终需要重新启动。

当你只是浏览网页等时,你的系统几乎什么也没做。但如果你的系统在运行CPU密集型应用程序时锁定,它可能会暴露出你不知道的问题。

虽然这在Stack Overflow上有点不合适,但它属于硬件和软件之间的灰色地带。我建议对你的系统进行压力测试,并关注CPU/GPU/内存温度和电源电压。请查看MemTest86Stresslinux


这是一台全新的电脑,才几周大。我正在监控CPU、GPU和内存。内存确实有点高,但远未达到我的RAM极限。我还能运行各种其他密集型应用程序,即使在其他情况下也能运行此应用程序。我肯定会检查那些应用程序,可能是我漏掉了什么。 - en_Knight
不应该有任何用户模式下的操作会导致系统死机(除非调用了有缺陷的内核/驱动程序服务)。所有存储数据的地方都只是“内存” - 肯定没有什么东西会导致系统死机。 - Jonathon Reinhart
好的,我相信你 - 你可能是对的,这可能与硬件有关。在不同的电脑上进行测试应该可以确认这一点。如果没有其他答案闪现出来,我将接受这个答案。 - en_Knight
硬件问题可能会以最奇怪和不可预测的方式表现出来。祝你好运! - Jonathon Reinhart
这是一台全新的电脑,只有几周的历史。我猜测问题出在“烂驱动程序”上。 - Martin James
显示剩余2条评论

0
操作系统冻结最微不足道的原因是“内存已满”。如果您有使用大量内存的进程,则系统将从主内存(通常为RAM)交换到辅助内存(通常为磁盘),这会导致非常巨大的开销...作为用户,您通常观察到的是几乎冻结的计算机,有时甚至冻结到您认为它已经崩溃了。如果您的操作系统设计不良,则有时会崩溃!

这就是我预期的问题,但我一直在密切监控内存。它确实被消耗掉了,但当程序崩溃时,通常使用的内存比执行顺畅时的其他时间要少得多。 - en_Knight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接