当前位置:  开发笔记 > 编程语言 > 正文

如何正确找到Heisenbug?

如何解决《如何正确找到Heisenbug?》经验,为你挑选了1个好方法。

经过一些资源修改(图像),我的程序一直在随机崩溃(0xC0000005).我知道这些来自糟糕的内存管理,但我无法找到它来自哪里,原因有两个:第一,我没有手动使用很多指针或动态分配变量(我的意思是我使用的标准库它对我而言,第二,当我使用gdb进行调试时,错误不会发生(但是在运行调试版本时出现,没有gdb).

我试图找出错误sd::cout,但由于我的程序编写方式,我仍然找不到它.我加倍,三重检查我使用的指针和动态数组,仍然无法找到它.有关信息,调试编译"-g -std=c++14",但没有"-O2".我使用Code::Block64位MingW和GCC 5.1.0以及gdb 7.9.

所以,我读了很多类型的bug(0xC0000005)和Heisenbug,但我不知道如何处理它,我不知道现在该尝试什么.

我会告诉你代码,但它分布在30个文件中.如果你真的想看到的,它在这里 GitHub上虽然.

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

那么你有什么建议让我能够找到bug的来源吗?



1> Matteo Itali..:

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

通过启动该程序首先,然后安装调试你避免一个"正常"运行,"调试"运行之间的这种差异,因此,你应该能够直接捕捉访问冲突在调试器.

除了"设法在调试器下重现崩溃"之外,您可能希望使用各种工具来帮助您更早地检测到错误; 最近的g ++版本提供了诸如地址清理程序和调试STL之类的工具,这有助于我找出许多未解决的错误多年.

顺便提一下,即使程序不在调试器下,Windows也可以在发生崩溃时启动其中一个已注册的程序,在通常的崩溃对话框中应该有一个"Debug"选项.似乎没有可能gdb在系统调试器之间注册,但如果您安装Visual C++ Express或Windows调试工具,您至少应该有一些调试器随时可用于这些场合(使用它们来调试g++生成的可执行文件)虽然使用矮人调试信息而不是PDB是另一种蠕虫病毒.


@CorentinM:使用bt命令获取回溯并查明该程序在程序中的哪个位置被调用。
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有