我有一个奇怪的情况,Valgrind输出完全相同的可执行文件在一台机器上不同于另一台机器。
我正在写一个Windowsregistry读/写库在C + +中,我一直在努力写在代码非常强大。 所以我一直在运行Valgrind,并且通过一系列unit testing生成的可执行文件来引入内存泄漏。
我的主要开发电脑是运行Linux Mint Debian Edition x86_64。 一个周末,我将自己的存储库克隆到正在运行Arch x86_64的笔记本电脑上,并开始出现在Valgrind中的内存泄漏(或更确切地说,仍然可以访问的块)。 拉了很多头发之后,我意识到,即使是Mint DE上最后一次提交的提交,也显示了Arch上的泄漏。 我也注意到,Arch盒子上的分配数量超过了四倍,尽pipe我不知道这是否意味着什么。
这是我在两台机器上使用相同的exe(在一台机器上编译并复制到另一台机器上):
Mint DE x86_64:
valgrind --leak-check=full --show-leak-kinds=all ./regnixtest ==12248== Memcheck, a memory error detector ==12248== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==12248== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info ==12248== Command: ./regnixtest ==12248== Testing Create Valid NK...passed [ normal command output snipped for brevity ] ==12248== ==12248== HEAP SUMMARY: ==12248== in use at exit: 0 bytes in 0 blocks ==12248== total heap usage: 603 allocs, 603 frees, 608,657,070 bytes allocated ==12248== ==12248== All heap blocks were freed -- no leaks are possible ==12248== ==12248== For counts of detected and suppressed errors, rerun with: -v ==12248== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Arch x86_64:
valgrind --leak-check=full --show-leak-kinds=all ./regnixtest ==5006== Memcheck, a memory error detector ==5006== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==5006== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info ==5006== Command: ./regnixtest ==5006== Testing Create Valid NK...passed [ normal command output snipped for brevity ] ==5006== ==5006== HEAP SUMMARY: ==5006== in use at exit: 72,704 bytes in 1 blocks ==5006== total heap usage: 2,927 allocs, 2,926 frees, 608,844,359 bytes allocated ==5006== ==5006== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1 ==5006== at 0x4C29F90: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5006== by 0x4EC01EF: pool (eh_alloc.cc:117) ==5006== by 0x4EC01EF: __static_initialization_and_destruction_0 (eh_alloc.cc:244) ==5006== by 0x4EC01EF: _GLOBAL__sub_I_eh_alloc.cc (eh_alloc.cc:307) ==5006== by 0x400F0E9: call_init.part.0 (in /usr/lib/ld-2.21.so) ==5006== by 0x400F1FA: _dl_init (in /usr/lib/ld-2.21.so) ==5006== by 0x4000DB9: ??? (in /usr/lib/ld-2.21.so) ==5006== ==5006== LEAK SUMMARY: ==5006== definitely lost: 0 bytes in 0 blocks ==5006== indirectly lost: 0 bytes in 0 blocks ==5006== possibly lost: 0 bytes in 0 blocks ==5006== still reachable: 72,704 bytes in 1 blocks ==5006== suppressed: 0 bytes in 0 blocks ==5006== ==5006== For counts of detected and suppressed errors, rerun with: -v ==5006== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
这是我的Arch盒子上的一个库的问题吗? 以下是在任何情况下,ldd的输出:
Mint DE x86_64:
ldd ./regnixtest linux-vdso.so.1 (0x00007ffc76ffc000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f080dcaa000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f080d9a9000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f080d792000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f080d3e9000) /lib64/ld-linux-x86-64.so.2 (0x00007f080dfd2000)
Arch x86_64:
ldd ./regnixtest linux-vdso.so.1 (0x00007ffd81bd5000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fcf9d788000) libm.so.6 => /usr/lib/libm.so.6 (0x00007fcf9d484000) libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fcf9d26e000) libc.so.6 => /usr/lib/libc.so.6 (0x00007fcf9cecc000) /lib64/ld-linux-x86-64.so.2 (0x00007fcf9db0a000)
这个项目最终将是开源的,但我还没有准备好把代码放在那里。 如果有帮助的话,我可以继续把它放在GitHub上。
在编写的时候,Mint有gcc 4.x,而Arch有gcc 5.2,所以就有这个区别。 这个简单的程序与g ++ 5.2编译和运行在相同的valgrind选项的拱显示相同的“泄漏”。
int main(void) { return 0; }
如果您担心隐藏实际问题的噪音,只需添加对此警告的抑制。