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