首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内存分配导致操作系统崩溃。除了操作系统之外,谁该受责备?

内存分配导致操作系统崩溃。除了操作系统之外,谁该受责备?
EN

Stack Overflow用户
提问于 2015-03-25 23:02:40
回答 1查看 325关注 0票数 5

这个短短的片段

代码语言:javascript
运行
复制
#include <new>

int main(){
  while(true){
     try{
        new char[0x10000000];
     }catch(std::bad_alloc bac){
     }
  }
}

显然,当编译为64位应用程序并在64位Windows系统上运行时,整个操作系统就会崩溃。

这是一个有效的c++程序。怎么会发生这种事?这里的msvc编译器也有问题吗?

所有其他编译器/系统组合在最坏的情况下都使系统呆滞。

可别在家里尝试这些哟。用户克利斯朵夫在他的系统上尝试了这个,结果它崩溃了。

请评论:我对调试不感兴趣。这是一个有效的c++程序。我的代码没有错。我很好奇是什么导致了这种行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-25 23:40:25

“当应用程序使用大量内存时,蓝色屏幕”的一个相当合理的场景是一个崩溃的驱动程序。这里有两个共同的问题:

  1. 当分配函数无法分配内存时,无法分配内存且无法检测到由NULL返回的驱动程序“,从而导致空内存访问或接近空内存访问。
  2. 驱动程序没有正确地“锁定”内存缓冲区,导致驱动程序“需要”的页面在使用页面时被交换--这会导致"IRQL不少于或等于“蓝屏,这是因为操作系统检测到一个页面时,在驱动程序处于”锁定“模式时发生在请求中。换句话说,驱动程序要求“在我完成此任务之前,不能运行任何其他任务”,然后会发生一个页面错误--它是从交换区请求页面中页面的一个请求,它确实需要一个不同的任务才能运行--不能吃蛋糕,所以OS说“不能做”--因为驱动程序不能访问内存,不能切换到另一个任务,所以我们只能做“报告错误和停止”。
  3. 第三种选择是驱动程序检测到它无法分配内存,但是决定它不能继续,然后调用Windows中的“我想现在就蓝屏”函数来发出自己的蓝屏。编写得很好的驱动程序不应该这样做,但是和一些司机一样,作者仍然认为这是一个“好主意”。

对不起,自从我写windows驱动程序以来已经过去11年了,所以我们可以预料到的确切错误代码已经丢失了。我认为7B用于IRQLNotLessOrEqual,0xC00000005用于访问未映射内存(NULL访问等)。

许多机器具有相似的硬件(例如,相同的打印机、USB鼠标或键盘),可以很容易地解释几台不同机器的行为相同的事实。或光盘驱动器,是片状),或通过拥有相同的反病毒软件- AV软件总是有一个驱动组件,以“钩”到其他进程等。

考虑到“内存真的耗尽”现在已经不常见了,没有那么熟练的/经验丰富的/认真的开发人员很可能不会用假内存或内存不足的情况进行适当的测试,从而无法检测到他们的驱动程序在这种情况下失败了。

为了提供更多的细节,我们至少需要知道蓝屏的“代码”(屏幕顶部有四到五个十六进制数字)。

假设调试此类故障有一定的意义,您可以在转储(或迷你转储)崩溃时设置窗口,或者使用第二台PC将WinDBG作为远程调试器或其他远程调试器连接到正在崩溃的机器上--当机器出现蓝屏时,它将在重新启动之前停在调试器中,这样您就可以看到系统的状态,包括查看导致崩溃的代码的调用堆栈--这通常会显示导致问题的实际上是什么组件。但是,除非您与驱动程序开发人员有很好的联系(至少是给相关支持人员的电子邮件地址),否则不太可能解决这个问题。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29268147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档