经过一些资源修改(图像),我的程序一直在随机崩溃(0xC0000005).我知道这些来自糟糕的内存管理,但我无法找到它来自哪里,原因有两个:第一,我没有手动使用很多指针或动态分配变量(我的意思是我使用的标准库它对我而言,第二,当我使用gdb进行调试时,错误不会发生(但是在运行调试版本时出现,没有gdb).
我试图找出错误sd::cout
,但由于我的程序编写方式,我仍然找不到它.我加倍,三重检查我使用的指针和动态数组,仍然无法找到它.有关信息,调试编译"-g -std=c++14"
,但没有"-O2"
.我使用Code::Block
64位MingW和GCC 5.1.0以及gdb 7.9.
所以,我读了很多类型的bug(0xC0000005)和Heisenbug,但我不知道如何处理它,我不知道现在该尝试什么.
我会告诉你代码,但它分布在30个文件中.如果你真的想看到的,它在这里 GitHub上虽然.
此外,您将无法测试它,因为我没有上传资源文件(我不拥有它们).
那么你有什么建议让我能够找到bug的来源吗?
启动程序,然后附加gdb
; 如果你在调试器下启动程序Windows切换到调试堆,这通常可以帮助检测内存使用问题,但有时会隐藏Heisenbugs(因为它实际上更改了未初始化内存的默认内容).
通过启动该程序首先,然后安装调试你避免一个"正常"运行,"调试"运行之间的这种差异,因此,你应该能够直接捕捉访问冲突在调试器.
除了"设法在调试器下重现崩溃"之外,您可能希望使用各种工具来帮助您更早地检测到错误; 最近的g ++版本提供了诸如地址清理程序和调试STL之类的工具,这有助于我找出许多未解决的错误多年.
顺便提一下,即使程序不在调试器下,Windows也可以在发生崩溃时启动其中一个已注册的程序,在通常的崩溃对话框中应该有一个"Debug"选项.似乎没有可能gdb
在系统调试器之间注册,但如果您安装Visual C++ Express或Windows调试工具,您至少应该有一些调试器随时可用于这些场合(使用它们来调试g++
生成的可执行文件)虽然使用矮人调试信息而不是PDB是另一种蠕虫病毒.