我可以让valgrind忽略glibc库吗?

时间:2010-05-24 10:13:51

标签: c linux valgrind glibc

是否有可能告诉valgrind忽略一些库? 特别是glibc库..

实际问题: 我有一些代码在正常执行中运行良好。没有泄漏等。

当我尝试通过valgrind运行它时,我得到了核心转储和程序重启/停止。

核心通常指向glibc函数(通常是fseek,mutex等)。 我理解不兼容的glibc / valgrind版本可能存在一些问题。

我尝试了各种valgrind版本和glibc版本,但没有运气。 有什么建议?

4 个答案:

答案 0 :(得分:10)

这可能无法解答您的问题,但会为您提供如何抑制某些错误的细节(其他人已提到但未详细描述):

首先,运行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
}

“stupid sendmsg bug”和链接是我为引用此块而添加的名称。现在,将该块保存到sendmsg.supp并在下次运行时告诉valgrind该文件:

valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out

valgrind将谦虚地忽略那个愚蠢的上游错误。

答案 1 :(得分:4)

正如unwind所述,valgrind有一个精心设计的机制来控制哪些程序被检测以及如何进行检测。但是valgrind和glibc都是复杂的野兽,你真的,真的,真的不想这样做。获得相互兼容的glibc和valgrind的简单方法是从您选择的Linux发行版中获取。事情应该“正常”,如果他们不这样做,你就有人抱怨。

答案 2 :(得分:3)

是的,请查看Valgrind的suppression system

答案 3 :(得分:1)

您可能想在Valgrind user's mailing list上询问此问题(这非常有帮助)。您可以抑制某些呼叫的输出,但是,您正在做的就是抑制噪音。这些电话仍在通过Valgrind。

为了达到你所需要的,你(理想情况下)适当地匹配Valgrind与glibc 使用valgrind/valgrind.h中的宏来解决它们。使用那些,是的,你可以告诉valgrind不要触摸某些东西。我不确定哪些调用都会将所有东西都塞进去,但如果它在valgrind下运行,你也可以(有选择地)在你自己的程序中运行一些代码。请参阅RUNNING_ON_VALGRIND中的valgrind/valgrind.h宏。

要想到的另一件事是确保Valgrind正确编译为deal with threads。请记住,Valgrind下的原子操作可能会导致程序在racey操作期间崩溃,否则可能会在没有正确配置的情况下崩溃。

如果你一直在交换valgrind和glibc的版本,你有可能找到匹配,但在构建时错误配置了valgrind。