2015-08-12 6 views
3

У меня странная ситуация, когда вывод 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.

+0

См.: http://stackoverflow.com/questions/3840582/still-reachable-leak-detected-by-valgrind –

+1

Монетный двор имеет gcc 4.x, а арка имеет gcc 5.2 на момент написания, поэтому есть эта разница. Простой 'int main (void) {return 0; } ', скомпилированный с g ++ и выполняемый с теми же параметрами valgrind на arch, показывает ту же« утечку ». Просто добавьте подавление этого предупреждения, если вас беспокоит шум, скрывающий реальные проблемы. – richq

+0

@richq Возможно, проблема в libgcc? Я думаю, что это должно быть в библиотеке где-то, так как бинарный файл, скомпилированный на arch, не представляет проблемы на мяте. Похоже, что ваши результаты по этому тестовому коду отвечают на мой вопрос (я не беспокоюсь о том, какая системная библиотека виновата, пока я знаю, что мой код правильно освобождает вещи). Вы можете преобразовать свой комментарий в ответ, если хотите, и я могу его принять. – Matthew

ответ

1

Монетный двор имеет gcc 4.x, в то время как у Arch есть gcc 5.2 на момент написания, так что есть разница. Эта простая программа, скомпилированная с g ++ 5.2 и работающая на Arch с теми же параметрами valgrind, показывает ту же «утечку».

int main(void) 
{ 
    return 0; 
} 

Просто добавьте подавление этого предупреждения, если вас беспокоит шум, скрывающий реальные проблемы.

Смежные вопросы