2010-11-11 2 views
5

Я только начал учиться использовать Valgrind и --tool = MemCheckКак использовать Valgrind эффективно

Но что у меня возникли проблемы с фактически находить проблемы.

например.

Одна из таких проблем - это.

==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) 

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

EDIT

Является ли это о чем беспокоиться? Кажется, исчезает с опцией --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 
+0

+1 очень важный инструмент, который можно использовать –

+0

Неинициализированные значения объясняются в QuickStart Valgrind http://valgrind.org/docs/manual /QuickStart.html (примерно 12 абзацев в целом, меньше о неинициализированных значениях.) – isomorphismes

ответ

15

В принципе, каждая ошибка 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)

+1

Спасибо за подсказку. Иногда ли это происходит? Я не вижу никаких неинициализированных переменных. Как насчет поздней инициализации? – Matt

+3

Valgrind почти никогда не сообщает ложных срабатываний. –

+0

Попробуйте продолжить трассировку стека, например, в строке 63 'mUUID.h', где вызывается обработчик обратного вызова. Все инициализированы все переменные-члены класса вашего обработчика? –