有没有可能告诉valgrind忽略一些库?尤其是glibc库。
实际问题: 我有一些代码在正常执行时运行良好,没有泄漏等问题。
但是当我试图通过valgrind运行它时,程序会出现核心转储并重新启动或停止。
核心通常指向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 bug”和链接都是我添加的名称,用于指代这个代码块。现在,请将该代码块保存为sendmsg.supp
,并在下一次运行时告诉valgrind
关于该文件:
valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out
而 valgrind
会优雅地忽略那个愚蠢的上游 bug。
正如 unwind 所指出的那样,valgrind 有一个复杂的机制来控制哪些过程被检测以及如何检测。但是,valgrind 和 glibc 都非常复杂,你真的不想这么做。获取相互兼容的 glibc 和 valgrind 的简单方法是从您选择的 Linux 发行版中获取两者。事情应该“只是工作的”,如果不行,您可以向某个人抱怨。
是的,可以看一下 Valgrind 的抑制系统。
你可能想在Valgrind用户邮件列表上询问(这非常有帮助)。你可以抑制某些调用的输出,但是,抑制噪音就是你所做的一切。这些调用仍然通过Valgrind进行。
为了实现你的需求,你最好将Valgrind与glibc匹配,或者使用valgrind/valgrind.h
中的宏来解决问题。使用这些宏,你可以告诉Valgrind不要触及某些东西。我不确定哪些调用会导致问题,但是如果在Valgrind下运行自己的程序,则还可以(有选择地)不运行代码的某些部分。请参见valgrind/valgrind.h
中的RUNNING_ON_VALGRIND
宏。