У меня странная ситуация, когда вывод Valgrind для одного и того же исполняемого файла отличается на одной машине, чем на другой.Различные выходные данные Valgrind на разных машинах
Я пишу библиотеку чтения/записи реестра Windows на C++, и я пытаюсь быть очень надежным в написании кода. Таким образом, я все время выполнял Valgrind и исправлял утечки памяти, поскольку они были введены с помощью исполняемого файла, который генерируется из пакета модульных тестов.
Мой главный компьютер разработки работает под управлением Linux Mint Debian Edition x86_64. В один уик-энд я клонировал свой репозиторий для своего ноутбука, на котором работает Arch x86_64, и я начал получать утечки памяти (или, скорее, все еще доступные блоки), которые появляются в Valgrind. После долгих подтяжек волос я понял, что даже последний фиксат, который был чист на Mint DE, показывал утечки на Arch. Я также заметил, что количество выделов больше, чем четыре раза в поле Arch, хотя я не знаю, означает ли это что-либо.
Вот что я, используя одни и те же исполняемые на обеих машинах (составленным на 1 машину и скопированных к другому):
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.
См.: http://stackoverflow.com/questions/3840582/still-reachable-leak-detected-by-valgrind –
Монетный двор имеет gcc 4.x, а арка имеет gcc 5.2 на момент написания, поэтому есть эта разница. Простой 'int main (void) {return 0; } ', скомпилированный с g ++ и выполняемый с теми же параметрами valgrind на arch, показывает ту же« утечку ». Просто добавьте подавление этого предупреждения, если вас беспокоит шум, скрывающий реальные проблемы. – richq
@richq Возможно, проблема в libgcc? Я думаю, что это должно быть в библиотеке где-то, так как бинарный файл, скомпилированный на arch, не представляет проблемы на мяте. Похоже, что ваши результаты по этому тестовому коду отвечают на мой вопрос (я не беспокоюсь о том, какая системная библиотека виновата, пока я знаю, что мой код правильно освобождает вещи). Вы можете преобразовать свой комментарий в ответ, если хотите, и я могу его принять. – Matthew