C++ 全系统崩溃,仅发布模式
Posted
技术标签:
【中文标题】C++ 全系统崩溃,仅发布模式【英文标题】:C++ full system crash, release mode only 【发布时间】:2011-12-13 12:56:48 【问题描述】:我已经为光线追踪应用程序实现了一个专门的树形数据结构。我在树的每个节点中使用 std::list 来存储数据项。我在运行应用程序时遇到问题,使用此数据结构不仅会使应用程序崩溃,而且会冻结整个操作系统(Windows 7)。这仅在发布模式下发生;在调试模式下,它需要更长的时间(正如预期的那样)但工作正常。我使用的是 Visual Studio 2010。在发布模式下运行 (Ctrl+F5) 或调试 (F5) 都会导致整个系统崩溃。
从我目前发现的情况来看,发布模式和调试模式之间的不同行为似乎归因于内存泄漏,因为调试模式(据我所知)更宽容一些。但是我没有发现 C++ 应用程序会导致操作系统崩溃。
我只想知道在什么情况下会发生这种行为,所以我知道去哪里找。很难将问题简化为简单的问题并追踪问题,因为光线追踪的本质是高度并行并处理大量数据。
哦,问题是不是导致堆栈溢出的无限递归。我是故意这样做的,它并没有使操作系统崩溃。
【问题讨论】:
从用户空间代码中冻结 Windows 7 的壮举。你说它是大规模并行和大量数据,可能是你的资源耗尽,导致整个系统几乎停滞不前。我已经让应用程序通过运行所有可用的 RAM 和交换来关闭 linux 机器,成为切换到终端并尝试终止应用程序的 3 分钟任务。 如果您的代码是可移植的,请尝试在更稳定的操作系统上编译它并查找错误原因。通过使操作系统崩溃进行调试需要很长时间。 如果你构建带有调试信息的发布版本,它可以正常工作吗?否则,它可能会帮助您缩小崩溃发生的范围。 另外,你没有任何代码依赖于DEBUG
/NDEBUG
宏?
您使用的是 GPU 资源吗?尝试更新机器上的图形驱动程序?
【参考方案1】:
您是否在调试模式下检查了内存使用情况?过多的内存使用和溢出到交换会像地狱一样减慢系统 - 你的系统在技术上可能没有崩溃 - 只是变得超级慢。在发布模式下,所有分配都会以相当快的速度发生 - 所以您可能想查看内存使用情况。
正如你所说,无限递归不会导致操作系统崩溃——它总是会导致分段错误。
【讨论】:
是的,这就是我想要达到的目的,应用程序可以如此快地分配内存和 CPU,调度程序甚至都看不到它的到来,一旦你点击交换/页面文件,它基本上就结束了. 我刚刚检查了调试和发布模式。在调试模式下,内存的增加非常少,并且有很多可用空间。在释放模式下,它会弹起来,系统会死机。所以,是的,你们对坠机原因的看法都是正确的。但是为什么在调试模式下我看不到同样的内存激增? 对不起,不能给你一个自信的答复..但这可能与c++运行时库如何在释放模式下处理动态内存分配和释放有关。搜索这些行可能会有所帮助。 @user983064 当编译器优化代码时,有些错误只会在发布模式下出现。 “严格的别名”问题是典型的例子(你是否在代码中某处的指针类型上做邪恶的 reinterpret_casts ?)。您的下一步是缩小问题发生的范围......在 Linux 系统上,我会禁用交换以使事情更快崩溃,不知道这是否是 Windows 上的一个选项。以上是关于C++ 全系统崩溃,仅发布模式的主要内容,如果未能解决你的问题,请参考以下文章
有个游戏叫rust 只要打开以后 系统就崩溃了 系统关键设置打不开 凡事要用网的软件全未响应。