是否有可能告诉valgrind忽略一些库? 特别是glibc库..
实际问题: 我有一些代码在正常执行中运行良好。没有泄漏等。
当我尝试通过valgrind运行它时,我得到了核心转储和程序重启/停止。
核心通常指向glibc函数(通常是fseek,mutex等)。 我理解不兼容的glibc / valgrind版本可能存在一些问题。
我尝试了各种valgrind版本和glibc版本,但没有运气。 有什么建议?
答案 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。