Как эффективно использовать valgrind - PullRequest
5 голосов
/ 12 ноября 2010

Я только начал учиться использовать valgrind и --tool = memcheck

Но с чем я сталкиваюсь, так это с фактическим нахождением проблем.

например

Одна из таких проблем заключается в следующем.

==12561== Conditional jump or move depends on uninitialised value(s)
==12561==    at 0x425779: Server::HandleReceiveFrom(boost::system::error_code const&, unsigned long) (mUUID.h:63)
==12561==    by 0x428EC4: boost::asio::detail::reactive_socket_recvfrom_op<boost::asio::mutable_buffers_1, boost::asio::ip::basic_endpoint<boost::asio::ip::udp>, boost::_bi::bind_t<void, boost::_mfi::mf2<void, Server, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<Server*>, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code, unsigned long) (mem_fn_template.hpp:280)
==12561==    by 0x42E589: boost::asio::detail::task_io_service::run(boost::system::error_code&) (task_io_service_operation.hpp:35)
==12561==    by 0x42720C: Server::Run() (io_service.ipp:57)
==12561==    by 0x42FB00: main (obbs.cpp:198)

, и еще один это

== Use of uninitialised value of size 8
==12561==    at 0x5E56091: _itoa_word (_itoa.c:196)
==12561==    by 0x5E573D8: vfprintf (vfprintf.c:1613)
==12561==    by 0x5F0EA6F: __vsnprintf_chk (vsnprintf_chk.c:65)

Мне нужны некоторые советы о том, как наиболее эффективно отследить эти типы проблем.(Условные переходы и неинициализированные значения.)

РЕДАКТИРОВАТЬ

Об этом стоит беспокоиться?Кажется, исчезает с опцией --run-libc-freeres=no.Означает ли это, что у меня глючная библиотека C?

==14754== Invalid free() / delete / delete[]
==14754==    at 0x4C27D71: free (vg_replace_malloc.c:366)
==14754==    by 0x5F43A0A: free_mem (in /lib/libc-2.12.1.so)
==14754==    by 0x5F435A1: __libc_freeres (in /lib/libc-2.12.1.so)
==14754==    by 0x4A2366B: _vgnU_freeres (vg_preloaded.c:62)
==14754==    by 0x5E4A4A4: exit (exit.c:93)
==14754==    by 0x5E2FD94: (below main) (libc-start.c:258)
==14754==  Address 0x4046bb8 is not stack'd, malloc'd or (recently) free'd

1 Ответ

15 голосов
/ 12 ноября 2010

Обычно каждая ошибка Valgrind отображает трассировку стека. Более высокие части трассировки стека могут быть не очень полезны для вас, поскольку они ссылаются на код библиотеки. Однако, в конечном счете, эти проблемы проистекают из проблем в вашем коде. Начните с сканирования первой части трассировки стека, которая ссылается на строку кода в вашем приложении (в отличие от библиотечной функции). Если вы изучите трассировку стека, вы увидите, что строка 198 из obbs.cpp является укажите в вашей заявке причину вашей первой проблемы. Далее по стеку вы можете видеть, что строка 63 из mUUID.h в конечном счете вычисляет неинициализированную переменную либо с помощью оператора if, либо с помощью цикла.

Ошибка "Conditional jump or move depends on uninitialised value(s)" означает, что у вас есть неинициализированная переменная, которая используется для воздействия на поток вашей программы. В вашем случае похоже, что вы передаете неинициализированную переменную в библиотечную функцию Boost, а библиотечная функция вызывает ваш класс-обработчик, который оценивает неинициализированную переменную в условном выражении. Это означает, что ваша программа демонстрирует неопределенное поведение.

Тривиальный пример, который может вызвать эту проблему, будет выглядеть примерно так:

int i; // uninitialized value
if (i == 10) { /* ... do something */ }

Начните с проверки строки 198 obbs.cpp и двигайтесь вверх по трассе стека, пока не поймете проблему.

Я также добавлю, что подобные ошибки могут иногда обнаруживаться компилятором, если вы компилируете все предупреждения. (В GCC, например, убедитесь, что вы компилируете с флагом -Wall)

...