是否可以告诉 valgrind 忽略某些库?特别是 glibc 库..
实际问题:我有一些在正常执行中运行良好的代码。无泄漏等。
当我尝试通过 valgrind 运行它时,我得到核心转储和程序重新启动/停止。
Core 通常指向 glibc 函数(通常是 fseek、mutex 等)。我了解不兼容的 glibc / valgrind 版本可能存在一些问题。
我尝试了各种 valgrind 版本和 glibc 版本,但没有运气。有什么建议么?
这可能不会回答您的问题,但会为您提供如何抑制某些错误的细节(其他人已经提到但没有详细描述):
首先,运行valgrind
如下:
valgrind --gen-suppressions=all --log-file=valgrind.out ./a.out
现在输出文件valgrind.out
将包含一些自动生成的抑制块,如下所示:
{
stupid sendmsg bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14687
Memcheck:Param
sendmsg(mmsg[0].msg_hdr)
fun:sendmmsg
obj:/usr/lib/libresolv-2.17.so
fun:__libc_res_nquery
obj:/usr/lib/libresolv-2.17.so
fun:__libc_res_nsearch
fun:_nss_dns_gethostbyname4_r
fun:gaih_inet
fun:getaddrinfo
fun:get_socket_fd
fun:main
}
其中“愚蠢的 sendmsg 错误”和链接是我添加来引用此块的名称。现在,将该块保存到并在下次运行时sendmsg.supp
告知该文件:valgrind
valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out
并且valgrind
会优雅地忽略那个愚蠢的上游错误。
正如 unwind 所指出的,valgrind 有一个复杂的机制来控制哪些程序被检测以及如何检测。但是 valgrind 和 glibc 都是复杂的野兽,你真的,真的,真的不想这样做。获得相互兼容的 glibc 和 valgrind 的简单方法是从您选择的 Linux 发行版中获得两者。事情应该“正常工作”,如果他们不这样做,你就会有人抱怨。
是的,看看 Valgrind 的压制系统。
您可能想在Valgrind 用户的邮件列表中询问这个问题(这非常有帮助)。您可以抑制某些调用的输出,但是,抑制噪音就是您所做的一切。电话仍在通过 Valgrind。
为了完成您的需要,您(理想情况下)将 Valgrind 与 glibc 适当地匹配或使用宏valgrind/valgrind.h
来解决它们。使用这些,是的,你可以告诉 valgrind 不要碰某些东西。我不确定是什么调用使一切变得无聊,但是如果它在 valgrind 下运行,您也可以(有选择地)不在您自己的程序中运行一些代码。请参阅 中的RUNNING_ON_VALGRIND
宏valgrind/valgrind.h
。
想到的另一件事是确保正确编译 Valgrind 以处理线程。请记住,Valgrind 下的原子操作可能会导致您的程序在竞速操作期间崩溃,否则如果配置不当,它可能不会崩溃。
如果您一直在交换 valgrind 和 glibc 的版本,那么您有可能找到匹配项,但在构建时错误地配置了 valgrind。