如何有效地使用valgrind

我刚开始学习使用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) 

我想了解如何最有效地跟踪这些types的问题。 (有条件的跳转和未初始化的值。)

编辑

这有什么好担心的吗? 似乎消失与选项--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 

基本上,每个Valgrind错误都显示一个堆栈跟踪。 堆栈跟踪的较高部分可能对您不太有用,因为它们引用了库代码。 但是,最终这些问题源于您的代码中的问题。 首先扫描堆栈跟踪的第一部分,它涉及到应用程序中的一行代码(而不是库函数)。如果检查堆栈跟踪,您会看到obbs.cpp的第198 obbs.cpp是指出你的应用程序导致你的第一个问题的原因。 再往上看,你可以看到mUUID.h第63行最终是通过if语句或循环来评估未初始化变量的地方。

错误“ Conditional jump or move depends on uninitialised value(s) ”意味着您有一个未初始化的变量用于影响程序的流程。 在你的情况下,它看起来像传递一个未初始化的变量到Boost库函数,库函数正在调用你的处理程序类,它在条件语句中计算未初始化的变量。 这意味着您的程序正在展示未定义的行为。

会导致这个问题的一个微不足道的例子会是这样的:

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

首先检查obbs.cpp第198行,然后向上移动堆栈跟踪直到您意识到问题。

我还要补充说,如果编译时有全部的警告,那么编译器有时会发现这样的错误。 (例如,在GCC中,确保使用-Wall标志进行编译)