【问题标题】:What Can Cause a C Program to Crash Operating System什么可能导致 C 程序崩溃操作系统
【发布时间】:2014-12-16 06:18:45
【问题描述】:

我最近发现我在 Windows 8 机器上用 C 语言编写的一个相当大的图像处理程序在非常特殊的情况下使用时会出现错误。不幸的是,该错误导致我的整个计算机停止运行,因此我唯一的选择就是拔掉计算机上的插头(当我远程工作时尤其烦人......)

因为它是一个图像处理程序,我不能只是用 print 语句来隔离有问题的部分 - 问题发生在一个被称为数十亿次的循环中的某个地方,所以添加一个 printf 会减慢它的速度失败的迭代需要几天时间。

因此,我理解,如果这个问题过于宽泛,因为我将所有可能导致我的问题的代码都写下来并不合理,我只是在问

在什么情况下,C 代码实际上可以冻结整个操作系统,而不是段错误或停止程序

当我搜索问题时,我看到这样的代码高尔夫问题

A C program which crashes the system(shuts down the system)

这不是我要问的——显然我没有在循环中的任何地方写 system("shutdown")

对python和java最为熟悉,这个问题不是我习惯的,而是我的经验,

  • 除以零会产生段错误
  • 意外访问稍微超出预期数组的内存会导致 seg 错误(有时会出现一点点)
  • 访问受保护的内存会导致程序挂起
  • 堆栈溢出导致段错误
  • 取消引用未初始化的指针会导致段错误

这种印象是错误的吗?这些情况会导致整个系统崩溃吗?我错过了哪些案例?它取决于我的 gcc 版本,还是我的权限状态?

我还不能尝试在不同的操作系统上重现它,因为它需要一些依赖项才能运行整个程序。

如果我唯一的选择是坐几天等待程序使用打印语句运行,或者避免出现奇怪的情况,那么,当然,就这样吧。我正在寻找寻找错误的关键位置。

【问题讨论】:

  • 尝试按Ctrl+Shift+ESC 并稍等片刻。在一分钟内,任务管理器窗口应该打开,检查是否有高 CPU 利用率进程正在运行(您的应用程序?)
  • 我试过了。我等了……等了……等了。随着我等待的时间,我想我可以解决停止问题并证明操作系统永远不会恢复活力:) 我可以在我想的虚拟计算机上运行它,然后从我的主计算机监控它,然后使用那个把戏
  • 代替打印语句将您的调试写入文件。数十亿次迭代可能仍然很慢,但没有写入屏幕那么慢。
  • 如果您的 C 程序导致操作系统崩溃(并且您在通用桌面/服务器操作系统上运行),那么 4 件事情中的一件正在发生: 1. 您的硬件有缺陷/出现故障。 2. 操作系统内核(包括以内核模式运行的驱动程序)存在错误。 3. 你正在编写内核代码并使内核崩溃。 4. 您正在访问操作系统的低级特权部分并搞砸系统(例如,粉碎操作系统运行的硬盘驱动器或杀死系统关键进程)。
  • @xmojmr 是的,我会的 - 我今天正在其他计算机上测试代码,希望这能帮助我找到源代码

标签: c crash operating-system


【解决方案1】:

在用户模式和内核模式之间具有硬件强制权限分离的现代系统上,以及能够正确配置这些机制的操作系统上,您根本无法从用户模式进程中崩溃系统。 em>

这些错误中的任何一个都会被 CPU 捕获,它会调用操作系统中的异常处理程序,这会迅速拔掉您系统上的插头。

如果我不得不猜测,硬件过热或出现故障:

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

我见过加密币挖掘软件让系统崩溃,因为它突破了 GPU 的极限。当卡锁定/重置时,驱动程序会感到困惑或锁定,最终需要重新启动系统。

当您只是坐在那里浏览网页等时,您的系统在旁边什么都不做。但是如果您的系统在您开始运行 CPU 密集型应用程序时锁定,它可能会导致你不知道的问题在哪里。

虽然这在 Stack Overflow 上有点不合时宜,但它属于硬件和软件之间的灰色区域之一。我会对您的系统进行压力测试,密切关注 CPU/GPU/内存温度和电源电压。查看MemTest86Stresslinux

【讨论】:

  • 这是一台全新的电脑,已经使用了几周。我正在监视 cpu、gpu 和内存。内存肯定在那里,但它离我的 RAM 限制还很远。我还能够运行各种其他密集型应用程序,即使是在其他情况下也是如此。不过,我肯定会检查这些应用程序,当然可能是我缺少的东西
  • 您是否使用任何 GPU 加速?
  • 不,我不是,事实上我拿出了所有的 GPU 代码进行调试,但没有帮助。从您的回答看来,它似乎不是这样,但是数据存储在哪里 - 数据部分、堆、堆栈 - 相对于索引中的错误将如何显示本身是否重要?
  • 没有。您不应该从用户模式做任何事情来导致您的系统锁定(除了可能调用有问题的内核/驱动程序服务)。所有这些存储数据的地方都“只是内存”——那里肯定没有任何东西会导致您的系统锁定。
  • 好吧,我相信你——你可能是对的,它与硬件有关。在另一台计算机上测试它应该可以确认这一点。如果没有很快以不同答案的形式出现令人眼花缭乱的灵感,我会接受这一点。
【解决方案2】:

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

【讨论】:

  • 这是我预期的问题,但我一直在密切监视内存。它肯定被吃掉了,但是当程序崩溃时,它通常在执行过程中使用的内存比其他运行顺利时要少得多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多