gpt4 book ai didi

c++ - 如何正确找到 Heisenbug?

转载 作者:太空狗 更新时间:2023-10-29 20:23:11 25 4
gpt4 key购买 nike

经过一些资源修改(图像)后,我的程序随机崩溃 (0xC0000005)。我知道这些来自糟糕的内存管理,但我找不到它的来源,原因有二:首先,我没有使用很多指针或手动动态分配的变量(我的意思是我使用的是标准库它对我来说),其次,当我使用 gdb 进行调试时,该错误不会发生(但它确实在运行调试构建时出现,没有 gdb)。

我试图用 sd::cout 找出错误,但由于我的程序编写方式,我仍然找不到它。我对我使用的指针和动态数组进行了双重、三次检查,仍然找不到。有关信息,调试是使用 "-g -std=c++14" 编译的,但没有 "-O2"。我将 Code::Block 与带有 GCC 5.1.0 和 gdb 7.9 的 64 位 MingW 一起使用。

所以,我阅读了很多关于此类错误 (0xC0000005) 和 Heisenbug 的内容,但我不知道如何处理它,我不知道现在该尝试什么。

我会向您展示代码,但它分布在 30 个文件中。如果你真的想看,那就是here虽然在 github 上。

此外,您将无法测试它,因为我没有上传资源文件(我不拥有它们)。

那么你有什么建议可以让我找到错误的来源吗?

最佳答案

启动程序,然后附加gdb;如果您在调试器下启动程序,Windows 会切换到调试堆,这通常有助于检测内存使用问题,但有时会隐藏 Heisenbugs(因为它实际上会更改未初始化内存的默认内容)。

通过首先启动程序,然后附加调试器,您可以避免“正常”运行和“调试”运行之间的这种差异,因此您应该能够直接在调试器。

除了“设法在调试器下重现崩溃”之外,您可能还想使用各种工具来帮助您更早地检测到错误;最近的 g++ 版本提供了诸如地址清理器和调试 STL 之类的工具,这帮助我查明了许多多年来 Unresolved 严重错误。

顺便说一下,即使程序尚未在调试器下,Windows 也提供了在崩溃的情况下启动其中一个已注册程序的可能性,在通常的崩溃对话框中应该有一个“调试”选项。似乎不可能在系统调试器之间注册 gdb,但是如果您安装了 Visual C++ Express 或 Windows 的调试工具,您至少应该为这些情况准备好某种调试器(不过,使用它们来调试 g++ 生成的可执行文件和矮小的调试信息而不是 PDB 是完全不同的蠕虫)。

关于c++ - 如何正确找到 Heisenbug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com