我可以让valgrind忽略glibc库吗?

13

有没有可能告诉valgrind忽略一些库?尤其是glibc库。

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

但是当我试图通过valgrind运行它时,程序会出现核心转储并重新启动或停止。

核心通常指向glibc函数(通常是fseek、mutex等)。 我明白可能存在与不兼容的glibc / valgrind版本相关的问题。

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

4个回答

12
这可能不是你问题的答案,但会为你提供如何抑制某些错误的具体细节(其他人已经提到过但没有详细描述):
首先,按以下方式运行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 bug”和链接都是我添加的名称,用于指代这个代码块。现在,请将该代码块保存为sendmsg.supp,并在下一次运行时告诉valgrind关于该文件:

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

valgrind 会优雅地忽略那个愚蠢的上游 bug。


1
有些相关... https://dev59.com/5HA75IYBdhLWcg3wqK7_#14779512。这个链接讲述了如何创建自己的通配符抑制规则。 - Trevor Boyd Smith

4

正如 unwind 所指出的那样,valgrind 有一个复杂的机制来控制哪些过程被检测以及如何检测。但是,valgrind 和 glibc 都非常复杂,你真的不想这么做。获取相互兼容的 glibc 和 valgrind 的简单方法是从您选择的 Linux 发行版中获取两者。事情应该“只是工作的”,如果不行,您可以向某个人抱怨。


3

我认为他想告诉Valgrind不要对某些glibc函数进行分析,而不仅仅是抑制结果输出。 - Tim Post
@Tim:没错!基本上我希望 valgrind 忽略它们(像正常执行一样执行)。 - Jack
@Jack - 你需要对valgrind内部有相当熟悉的了解。我强烈建议看一下valgrind/valgrind.h,除非你把从valgrind得到的输出发布出来,否则很难提出建议。 - Tim Post

1

你可能想在Valgrind用户邮件列表上询问(这非常有帮助)。你可以抑制某些调用的输出,但是,抑制噪音就是你所做的一切。这些调用仍然通过Valgrind进行。

为了实现你的需求,你最好将Valgrind与glibc匹配,或者使用valgrind/valgrind.h中的宏来解决问题。使用这些宏,你可以告诉Valgrind不要触及某些东西。我不确定哪些调用会导致问题,但是如果在Valgrind下运行自己的程序,则还可以(有选择地)不运行代码的某些部分。请参见valgrind/valgrind.h中的RUNNING_ON_VALGRIND宏。

另一件需要注意的事情是确保Valgrind正确编译以处理线程(deal with threads)。请记住,在Valgrind下,原子操作可能会在竞争操作期间导致程序崩溃,如果未正确配置,则否则可能不会发生崩溃。
如果您一直在交换valgrind和glibc的版本,则有可能找到了匹配项,但在构建时配置了错误的valgrind。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接