当前位置:  开发笔记 > 编程语言 > 正文

如何有效地使用valgrind

如何解决《如何有效地使用valgrind》经验,为你挑选了1个好方法。

我刚开始学习使用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::_bi::bind_t, boost::_bi::list3, 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

Charles Salv.. 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> Charles Salv..:

基本上,每个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标志进行编译)


Valgrind几乎从不报告误报.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有