2015-04-18 3 views
0

Привет, может кто-нибудь, пожалуйста, объясните, что означает этот выход valgrind и как я должен это исправить? Выход, который я отправляю в настоящее время, является частью фактического вывода терминала. Остальное тоже похоже, и в основном перечислены те же ошибки.Интерпретация вывода valgrind для программы C++/SDL2

Это для программы на С ++, использующей SDL2.

Соответствующий код действительно длинный, поэтому я добавлю все, что задано в комментариях.

Это происходит из-за некоторых SDL_Surface * s? Но я должен был освободить всех из них до возвращения из main(). Кроме того, мой SDL_Window * является глобальным. Это может вызвать проблемы.

Этот вывод приводит к segfault, который возникает только в Ubuntu, а не в Mac OSX! Я знаю, что Xcode на MAC инициализирует неинициализированные переменные и продолжается, но то же самое не происходит в Ubuntu. Но выход valgrind не показывает никаких uninit переменных даже с trace-originins = yes в методе memcheck.

Кроме того, у меня нет функций с именем 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) 

ответ

2

Без знания программы выход Valgrind совершенно бессмыслен. Например, вы можете выбрать что-то глобальное и никогда не удалять, даже при выключении. Это нисколько не больно, но Valgrind предупредит вас об утечке, потому что это формально. Ничто из этого не должно приводить к каким-либо segfaults, хотя и ваша интерпретация, вызванная этим результатом, очень сомнительна.

Теперь, что касается функций dl_*, это из динамического загрузчика на Linux, поэтому есть вероятность, что вы их не вызвали. Вероятно, это что-то игнорировать, которое вы могли бы попытаться воспроизвести, разделив свою программу до такой степени, что вы уверены, что ваш код не вызывает никаких проблем.

Что касается глобального, это тоже не имеет значения, потому что у необработанного указателя нет деструктора. Однако, если вы не отпустите ресурс, который он представляет, Valgrind сообщит об этом как об ошибке.

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