我使用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在这里告诉我的任何事情都会受到赞赏。
答案 0 :(得分:0)
感谢来自@sehe的一些有用的链接和一些进一步的谷歌搜索,我发现了问题。问题是,虽然sendmsg
正在读取的缓冲区已正确初始化,但在极少数情况下,某些复制到其中的数据并非如此。我不知道valgrind能够进行那种递归跟踪。
对于记录,在进入系统调用的路上和new
中的完整堆栈跟踪都没有显示底层问题的位置。该缓冲区填充在已完成执行的另一个线程上。我想这可能是我在--track-origins=yes
找到的东西,但不幸的是,valgrind旋转到100%的CPU并且在我在这个应用程序上尝试它时永远不会终止。