解释 C++/SDL2 程序的 valgrind 输出
Interpreting valgrind output for a C++/SDL2 program
嗨,有人可以解释一下这个 valgrind 输出的含义以及我应该如何解决这个问题吗?我当前发布的输出是实际终端输出的一部分。其余的也类似,并且列出了大部分相同的错误。
这适用于使用 SDL2 的C++程序。
相关代码真的很长,所以我会在评论中添加任何要求的内容。
这是由于某些SDL_Surface*而发生的吗?但我确保在从main()返回之前释放所有这些。此外,我的SDL_Window*是全球性的。这会导致问题吗?
此输出会导致仅在 Ubuntu 中出现的段错误,而不是在 Mac OSX 中出现的段错误!!我知道 MAC 上的 Xcode 初始化未初始化的变量并继续,但在 Ubuntu 中不会发生同样的情况。但是 valgrind 输出不会显示任何 uninit 变量,即使在 memcheck 工具中使用跟踪来源 = yes。
另外,我没有任何名为 call_init or_dl_init 或 dl_open_worker 的函数!!
==17744== 402 bytes in 7 blocks are possibly lost in loss record 506 of 630
==17744== at 0x4C2CC90: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17744== by 0xD3A56A1: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744== by 0xD3A5944: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744== by 0xD3965C5: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744== by 0xD152EAF: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744== by 0x4010139: call_init.part.0 (dl-init.c:78)
==17744== by 0x4010222: call_init (dl-init.c:36)
==17744== by 0x4010222: _dl_init (dl-init.c:126)
==17744== by 0x4014C6D: dl_open_worker (dl-open.c:577)
==17744== by 0x400FFF3: _dl_catch_error (dl-error.c:187)
==17744== by 0x40143AA: _dl_open (dl-open.c:661)
==17744== by 0x601E02A: dlopen_doit (dlopen.c:66)
==17744== by 0x400FFF3: _dl_catch_error (dl-error.c:187)
==17744== 512 bytes in 1 blocks are possibly lost in loss record 519 of 630
==17744== at 0x4C2CC90: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17744== by 0xD3D3689: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744== by 0xD412E86: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744== by 0xD3D1288: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744== by 0xB198E60: ??? (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744== by 0xB16D9D3: ??? (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744== by 0xB16A0BA: ??? (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744== by 0xB16A932: glXChooseVisual (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744== by 0x4EEDD9E: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744== by 0x4EEDFD0: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744== by 0x4EE2BE5: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744== by 0x4EE477B: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744==
==17744==
==17744== LEAK SUMMARY:
==17744== definitely lost: 73,806 bytes in 8 blocks
==17744== indirectly lost: 0 bytes in 0 blocks
==17744== possibly lost: 1,962,378 bytes in 4,720 blocks
==17744== still reachable: 2,908,902 bytes in 5,710 blocks
==17744== suppressed: 0 bytes in 0 blocks
==17744== Reachable blocks (those to which a pointer was found) are not shown.
==17744== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==17744==
==17744== For counts of detected and suppressed errors, rerun with: -v
==17744== ERROR SUMMARY: 194 errors from 186 contexts (suppressed: 5 from 1)
不知道程序,瓦尔格林德输出是完全没有意义的。例如,您可以选择全局分配某些内容,并且从不删除它,即使在关闭时也是如此。它不会以任何方式造成伤害,但瓦尔格林德会警告您泄漏,因为这就是正式的。不过,这些都不应该导致任何段错误,您对输出导致它的解释是非常值得怀疑的。
现在,关于dl_*
函数,这些函数来自 Linux 上的动态加载程序,所以很可能不是你造成的。可能它们是需要忽略的东西,你可以尝试通过剥离程序来重现它们,直到你确定你的代码不会导致任何问题。
关于全局,这也无关紧要,因为原始指针没有任何析构函数。但是,如果您不释放它所代表的资源,Valgrind 会将其报告为错误。
- valgrind-hellgrind与泄漏检查的结果不同
- 如何在程序执行时查看Valgrind Massif输出(或其他堆分析器)?
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 使用valgrind跟踪段错误,并了解valgrind输出
- 在 Valgrind 输出中仍然可以访问 std 线程向量的块
- Valgrind 在主机名命令输出中显示内存泄漏
- 解释 C++/SDL2 程序的 valgrind 输出
- c++.valgrind输出:Syscall param open(filename)指向不可修改的字节
- 如何根据 Valgrind 输出进一步调试
- glibc上valgrind的输出在C++中检测到错误
- 解释R脚本的valgrind输出
- 这个Valgrind输出是什么意思?
- c++程序中的段故障难以理解的valgrind输出
- 不同的机器输出不同的Valgrind
- Valgrind总结:输出中是否存在内存泄漏?
- Valgrind输出带有地址和问号
- 解释Valgrind输出C++
- Valgrind输出位置不正确
- Valgrind的输出显示间接丢失的内存泄漏,但没有明确丢失或可能丢失
- 如何解释Valgrind输出