如何阅读此 valgrind 信息

how to read this valgrind informations

我是 运行 一个多线程程序,我每次都会遇到

这样的错误

malloc(): memory corruption

或分段错误。

我决定使用 valgrind 来调查我的程序显示了哪种问题。首先,我得到了以下输出。有人可以帮助我了解如何阅读输出消息吗?

 ==17413== Conditional jump or move depends on uninitialised value(s)
==17413==    at 0x47A2349: ns_name_ntop (ns_name.c:147)
==17413==    by 0x47A3271: ns_name_uncompress (ns_name.c:585)
==17413==    by 0x479B3EF: dn_expand (res_comp.c:93)
==17413==    by 0x479FD2B: __res_queriesmatch (res_send.c:327)
==17413==    by 0x47A0D19: __libc_res_nsend (res_send.c:1327)
==17413==    by 0x479DDC7: __libc_res_nquery (res_query.c:226)
==17413==    by 0x479E417: __libc_res_nquerydomain (res_query.c:582)
==17413==    by 0x479E8FB: __libc_res_nsearch (res_query.c:416)
==17413==    by 0x404B1D9: _nss_dns_gethostbyname3_r (dns-host.c:192)
==17413==    by 0x404B540: _nss_dns_gethostbyname_r (dns-host.c:273)
==17413==    by 0x42C53FA: gethostbyname_r@@GLIBC_2.1.2 (getXXbyYY_r.c:266)
==17413==    by 0x42C4B7B: gethostbyname (getXXbyYY.c:116)
==17413==  Uninitialised value was created by a stack allocation
==17413==    at 0x804ADA3: UDP_Server_Open(int&, unsigned short) (UDP_Server.cpp:16)
==17413== 
==17413== Use of uninitialised value of size 4
==17413==    at 0x47A2382: ns_name_ntop (ns_name.c:153)
==17413==    by 0x47A3271: ns_name_uncompress (ns_name.c:585)
==17413==    by 0x479B3EF: dn_expand (res_comp.c:93)
==17413==    by 0x479FD2B: __res_queriesmatch (res_send.c:327)
==17413==    by 0x47A0D19: __libc_res_nsend (res_send.c:1327)
==17413==    by 0x479DDC7: __libc_res_nquery (res_query.c:226)
==17413==    by 0x479E417: __libc_res_nquerydomain (res_query.c:582)
==17413==    by 0x479E8FB: __libc_res_nsearch (res_query.c:416)
==17413==    by 0x404B1D9: _nss_dns_gethostbyname3_r (dns-host.c:192)
==17413==    by 0x404B540: _nss_dns_gethostbyname_r (dns-host.c:273)
==17413==    by 0x42C53FA: gethostbyname_r@@GLIBC_2.1.2 (getXXbyYY_r.c:266)
==17413==    by 0x42C4B7B: gethostbyname (getXXbyYY.c:116)
==17413==  Uninitialised value was created by a stack allocation
==17413==    at 0x804ADA3: UDP_Server_Open(int&, unsigned short) (UDP_Server.cpp:16)

这意味着您在语句和 if.

中使用了一个单元化变量

Conditional jump or move depends on uninitialised value(s)

意味着你做了类似的事情:

[...]
int i;
if (i == 0) ...
...

Use of uninitialised value of size 4

意味着你可能有一个取消引用的单元化指针:

struct *p;
p->toto = 0;

对于最简单的方法,获取有关错误的信息是读取类似

的输出
 ==17413==    at 0x47A2349: ns_name_ntop (ns_name.c:147)

看看

  • 文件名(ns_name.c
  • 行号(147
  • 函数名称(ns_name_ntop

以及错误消息

Conditional jump or move depends on uninitialised value(s)

它基本上是说,您正在使用条件语句,例如 ifelse if 以及包含可以具有未初始化值的变量的表达式。未初始化数据的来源往往是:

  1. 过程中尚未初始化的局部变量。
  2. 堆块的内容(用 malloc() 或类似的函数分配),然后再在那里写东西。

这样,您就可以开始检查所有报告的消息了。

更多相关信息,您可以查看 Valgrind 中的 on-line manual for memcheck 工具。

==17413==  Uninitialised value was created by a stack allocation
==17413==    at 0x804ADA3: UDP_Server_Open(int&, unsigned short) (UDP_Server.cpp:16)

这表示在 UDP_Server.cpp 的第 16 行是对 gethostbyname 的调用,它被赋予了一个未初始化的值。