1

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

以下配置运行良好:带有“Release”和“Debug”配置的 GCC。带有“调试”配置的 VC++

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

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

4

3 回答 3

1

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

以下是MSVC 使用的其他幻数

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

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

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

于 2012-05-26T10:34:38.237 回答