【发布时间】: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