c - 什么会导致 C 程序崩溃操作系统

标签 c crash operating-system

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

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

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

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

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

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

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

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

  • 除以零会产生段错误
  • 意外访问略微超出预期阵列的内存会导致段错误(有时会稍微偏离)
  • 访问 protected 内存会导致程序挂起
  • 堆栈溢出导致段错误
  • 取消引用未初始化的指针会导致段错误

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

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

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

    最佳答案

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

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

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

  • 散热片导热不良导致 CPU 过热
  • 电源故障/尺寸不足
  • 发生故障的 DIMM
  • 硬盘故障
  • CPU 故障
  • GPU 故障/过热

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

    当您只是坐在那里浏览网页等时,您的系统几乎无所事事。但是如果您的系统在您开始运行 CPU 密集型应用程序时锁定,它可能会带来您不知道在哪里出现的问题。

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

    关于c - 什么会导致 C 程序崩溃操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26479670/

    相关文章:

    C 重新分配错误 : malloc(): invalid size (unsorted)

    c - MLF 是一种公平的调度协议(protocol)吗?

    linux - JsTestDriver 火狐浏览器崩溃

    string - 构建 16 位操作系统 - 字符数组不起作用

    operating-system - ThreadX 的哪些方面使其成为实时操作系统?

    c - 为什么这个程序会分配以下金丝雀值和汇编代码?

    c - 这个c文件的mexFunction怎么写

    c# - 在设计器中移动窗体上的控件时,Visual Studio 2012 突然崩溃

    ios - 如何快速登录使应用程序崩溃?

    assembly - 32 位 OR 如何保持加载指令?(RISC 风格的 32 位架构)