问题 我可以让valgrind忽略glibc库吗?


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

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

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

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

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


4836
2018-05-24 10:13


起源



答案:


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

第一次运行 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 将慷慨地忽略那个愚蠢的上游错误。


8
2018-03-20 21:29



有点相关...... stackoverflow.com/a/14779512/52074。该链接讨论了如何创建自己的通配符抑制规则。 - Trevor Boyd Smith


答案:


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

第一次运行 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 将慷慨地忽略那个愚蠢的上游错误。


8
2018-03-20 21:29



有点相关...... stackoverflow.com/a/14779512/52074。该链接讨论了如何创建自己的通配符抑制规则。 - Trevor Boyd Smith


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


4
2018-05-25 01:44





是的,看看Valgrind的 抑制系统


3
2018-05-24 10:57



我想他想告诉valgrind不要描述某些glibc函数,而不仅仅是抑制结果输出。 - Tim Post♦
@Tim:没错!基本上我希望valgrind忽略它们(像正常执行一样执行它们) - Jack
@Jack - 你需要对valgrind内部相当熟悉。我真的建议你看看valgrind / valgrind.h,除非你发布你从valgrind收到的输出,否则很难提出建议。 - Tim Post♦


你可能想问一下这个问题 Valgrind用户的邮件列表 (这非常有帮助)。您可以抑制某些呼叫的输出,但是,您正在做的就是抑制噪音。这些电话仍在通过Valgrind。

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

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

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


1
2018-05-24 14:45