什么可能导致C程序崩溃操作系统

时间:2014-10-21 05:46:31

标签: c crash operating-system

我最近发现,在Windows 8计算机上使用C语言编写的相当大的图像处理程序在非常特殊的情况下使用时会出现错误。不幸的是,这个错误导致我的整个计算机陷入停顿,所以我唯一的选择是拔掉电脑上的插头(特别是当我远程工作时很烦人......)

因为它是一个图像处理程序,所以我不能用print语句来填充它以隔离有问题的部分 - 问题出现在一个被称为数十亿次的循环中,所以添加一个printf会使它减慢到这一点进入失败的迭代需要几天时间。

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

在什么情况下C代码可以实际冻结整个操作系统

而不是分段错误或暂停程序

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

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

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

最熟悉python和java,这个问题不是我习惯的,但根据我的经验,

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

任何这些错误都会被CPU占用,它会调用操作系统中的异常处理程序,这会快速拔出系统上的插件。

如果我不得不猜测,一块硬件过热或发生故障:

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

我见过,cryptocoin-mining软件让系统瘫痪,因为它正在推动GPU的极限。当卡锁定/重置时,驱动程序会混淆或锁定,系统最终需要重新启动。

当您只是坐在那里浏览网络等时,您的系统正在 nothing 旁边。但是如果您开始运行CPU密集型应用程序时系统锁定,它可能会带来你不知道那里的问题。

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

答案 1 :(得分:0)

操作系统冻结的最微不足道的原因是"记忆已满#34;如果您的进程使用大量内存,那么您的系统将从主内存(通常是RAM)交换到辅助内存(通常是磁盘),这会导致非常大的开销...作为用户,您通常观察到的是一台几乎冻结的计算机,有时如此冻结,以至于你认为它已经崩溃了。如果您的操作系统设计糟糕,那么它有时会崩溃!