有可能告诉valgrind忽略一些库吗? 特别是glibc库..
实际问题: 我有一些代码在正常执行中运行良好。没有泄漏等
当我尝试通过valgrind运行它时,我得到核心转储和程序重启/停止。
核心通常指向glibc函数(通常是fseek,mutex等)。 我知道不兼容的glibc / valgrind版本可能存在一些问题。
我尝试了各种valgrind版本和glibc版本,但没有运气。 有什么建议么?
有可能告诉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
}
其中“stupid sendmsg bug”和链接是我添加的名称,用于引用此块。现在,将该块保存到 sendmsg.supp
并告诉 valgrind
关于下一次运行的那个文件:
valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out
和 valgrind
将慷慨地忽略那个愚蠢的上游错误。
这可能不会回答您的问题,但会为您提供如何抑制某些错误的细节(其他人已提到但未详细描述):
第一次运行 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
将慷慨地忽略那个愚蠢的上游错误。
正如unwind所述,valgrind有一个精心设计的机制来控制哪些程序被检测以及如何进行检测。但是valgrind和glibc都是复杂的野兽,你真的,真的,真的不想这样做。获得相互兼容的glibc和valgrind的简单方法是 从您选择的Linux发行版中获取两者。事情应该“正常”,如果他们不这样做,你就有人抱怨。
是的,看看Valgrind的 抑制系统。
你可能想问一下这个问题 Valgrind用户的邮件列表 (这非常有帮助)。您可以抑制某些呼叫的输出,但是,您正在做的就是抑制噪音。这些电话仍在通过Valgrind。
为了达到你所需要的,你(理想情况下)适当地匹配Valgrind与glibc 要么 使用宏 valgrind/valgrind.h
解决他们。使用那些,是的,你可以告诉valgrind不要触摸某些东西。我不确定是什么调用可以解决所有问题,但是如果它在valgrind下运行,你也可以(有选择地)在你自己的程序中运行一些代码。见 RUNNING_ON_VALGRIND
宏观中 valgrind/valgrind.h
。
想到的另一件事是确保Valgrind正确编译 处理线程。请记住,Valgrind下的原子操作可能会导致程序在racey操作期间崩溃,否则可能会在没有正确配置的情况下崩溃。
如果你一直在交换valgrind和glibc的版本,你有可能找到匹配,但在构建时错误配置了valgrind。