解释valgrind输出(可能是误报?)

时间:2018-04-17 19:32:11

标签: c++ boost-asio valgrind

我使用boost :: asio(1.61)获得了gcc 4.9.1程序,valgrind 3.12.0报告了偶尔出现的错误。我很难理解我正在看什么,希望有人可以提供帮助。

Valgrind陷阱此错误:

==154023== Syscall param sendmsg(msg.msg_iov[0]) points to uninitialised byte(s)
==154023==    at 0x8FB3C6D: ??? (in /usr/lib64/libpthread-2.17.so)
==154023==    by 0x4F47287: boost::asio::detail::socket_ops::send(int, iovec const*, unsigned long, int, boost::system::error_code&) (socket_ops.ipp:1170)
  /* many levels elided */
==154023==  Address 0xe01cea4 is 9,396 bytes inside a block of size 524,304 alloc'd
==154023==    at 0x4C2AAFB: operator new[](unsigned long, std::nothrow_t const&) (vg_replace_malloc.c:466)

在附加的调试器中,我查看对sendmsg的调用:

(gdb) print msg
$1 = {
  msg_name = 0x0, 
  msg_namelen = 0, 
  msg_iov = 0x101c93c0, 
  msg_iovlen = 2, 
  msg_control = 0x0, 
  msg_controllen = 0, 
  msg_flags = 0
}
(gdb) print msg.msg_iov[0]
$2 = {
  iov_base = 0xe01cdf0, 
  iov_len = 198
}
(gdb) print &msg.msg_iov[0]
$3 = (iovec *) 0x101c93c0

如果我正在阅读valgrind的投诉权,它认为0xe01cea4的内存未初始化。但它是。如果我检查从0xe01cdf0开始的198字节内存,我会完全按预期看到我的外发消息。 0xe01cea4是该区域的180个字节,并且绝对是初始化的。要么我误解了valgrind告诉我的事情,要么这是误报。我倾向于相信这是我的错。

此外,我想知道为什么valgrind无论如何都对0xe01cea4地址感兴趣。我无法使用该值找到任何其他数据结构。这让我觉得它是valgrind。

但最后,这段代码经过多次循环,但偶尔只会抱怨,这让我回想起毕竟我的代码中发生了一些奇怪的事情。

任何人都可以了解valgrind在这里告诉我的任何事情都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

感谢来自@sehe的一些有用的链接和一些进一步的谷歌搜索,我发现了问题。问题是,虽然sendmsg正在读取的缓冲区已正确初始化,但在极少数情况下,某些复制到其中的数据并非如此。我不知道valgrind能够进行那种递归跟踪。

对于记录,在进入系统调用的路上和new中的完整堆栈跟踪都没有显示底层问题的位置。该缓冲区填充在已完成执行的另一个线程上。我想这可能是我在--track-origins=yes找到的东西,但不幸的是,valgrind旋转到100%的CPU并且在我在这个应用程序上尝试它时永远不会终止。