C ++程序以神秘的方式冻结

时间:2012-05-25 09:51:31

标签: c++ visual-c++ gcc crash

我用MS VC ++ 2010和GCC 4.2.1编写了一个C ++ CLI程序(对于Mac OS X 10.6 64位,在Eclipse中)。 该程序在GCC + OS X下运行良好,大部分时间在Windows下运行。但有时它会默默地冻结。命令行光标一直闪烁,但程序拒绝继续工作。

以下配置效果很好: GCC与'发布'和'调试'组态。 VC ++ with' Debug'构造

错误仅发生在配置&#VC; VC ++ with' Release'构造'在Win 7 32位和64位下。不幸的是,这是我的客户想要使用的配置; - (

我已经检查了我的程序高低,并修复了所有内存泄漏。但是这个错误仍然会发生。您对我如何找到错误有任何想法吗?

3 个答案:

答案 0 :(得分:1)

调试版本通常会初始化所有已分配的内存(MSVC使用调试配置将0xCD填充它们)。也许你的类中有一些未初始化的值,使用GCC配置和MSVC Debug配置它会获得“幸运”值,但在MSVC Release中它没有。

以下是the rest of the magic numbers used by MSVC

所以寻找未初始化的变量,属性和分配的内存块。

答案 1 :(得分:1)

  • 使用日志记录来缩小程序崩溃时正在执行的代码部分。继续添加日志,直到您将其缩小到足以查看问题为止。
  • 在发布版本(编译器和链接器)中启用调试信息;许多变量都不会正确显示,但它至少应该给你合理的回溯(除非冻结是由于堆栈粉碎或堆栈溢出),如果你保持函数简短并只做一件事,通常就足够了。
  • 内存泄漏不会导致死机。然而,其他形式的记忆滥用很可能。根据我的经验,当缓冲区被释放时,超越缓冲区通常会导致冻结,因为自由函数跟随损坏的块链。还要注意任何其他类型的未定义行为。在C / C ++中有很多它,它通常在调试时表现出来,在优化时完全随机。
  • 尝试在DUMA库下构建并运行程序以检查缓冲区溢出。请注意:
    • 需要很多的内存。我的意思很容易就像千倍。所以你只能在简单的情况下进行测试。
    • Microsoft标头倾向于滥用其内部分配功能并且不匹配,例如常规malloc和内部__debug_free(或另一种方式'round)。因此,在重新定义函数之前,可能需要通过将这些系统头文件包含在duma中来仔细解决这些问题。
  • 尝试为Linux构建程序并在Valgrind下运行它。这将检查除缓冲区溢出之外的更多问题,并且不会使用那么多内存(只有正常情况的两倍,但它更慢,大约20次)。

答案 2 :(得分:0)

谢谢大家,特别是Cody Gray和MikMik,我找到了! 正如你们中的一些人所建议我告诉VS在发布配置中生成调试信息和禁用优化。然后我启动了程序并暂停了它。或者,我远程连接到正在运行的进程。这有助于我找到错误所在的区域。 原因是无限循环,由数组边界后面的读取和缺少无效情况的排除引起。两者都导致运行时无法访问的停止条件。深奥的部分来自这样一个事实,即我的程序使用了一些随机值。 这就是生活...