【问题标题】:Can I make valgrind ignore glibc libraries?我可以让 valgrind 忽略 glibc 库吗?
【发布时间】:2011-02-23 04:20:34
【问题描述】:

是否可以告诉 valgrind 忽略某些库集? 特别是 glibc 库..

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

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

Core 通常指向 glibc 函数(通常是 fseek、mutex 等)。 我了解不兼容的 glibc / valgrind 版本可能存在一些问题。

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

【问题讨论】:

    标签: c linux valgrind glibc


    【解决方案1】:

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

    首先,运行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 错误”和链接是我添加的用于引用此块的名称。现在,将该块保存到 sendmsg.supp 并在下次运行时告诉 valgrind 该文件:

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

    valgrind 将慷慨地忽略那个愚蠢的上游错误。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      是的,请查看 Valgrind 的 suppression system

      【讨论】:

      • 我想他想告诉 valgrind 不要分析某些 glibc 函数,而不仅仅是抑制结果输出。
      • @Tim:没错!基本上我希望 valgrind 忽略它们(像正常执行一样执行它们)
      • @Jack - 为此,您需要相当熟悉 valgrind 的内部结构。我真的建议看一下 valgrind/valgrind.h ,除非您发布从 valgrind 收到的输出,否则很难提出建议。
      【解决方案4】:

      您可能想在Valgrind user's mailing list 上询问这个问题(这非常有帮助)。您可以抑制某些调用的输出,但是,抑制噪音就是您所做的一切。电话仍在通过 Valgrind。

      为了完成您的需要,您(理想情况下)将 Valgrind 与 glibc 相匹配使用valgrind/valgrind.h 中的宏来解决它们。使用这些,是的,你可以告诉 valgrind 不要碰某些东西。我不确定是什么调用使所有事情变得无聊,但是如果它在 valgrind 下运行,您也可以(有选择地)不在您自己的程序中运行一些代码。请参阅valgrind/valgrind.h 中的RUNNING_ON_VALGRIND 宏。

      想到的另一件事是确保将 Valgrind 正确编译为 deal with threads。请记住,Valgrind 下的原子操作可能会导致您的程序在竞速操作期间崩溃,否则如果配置不当,它可能不会崩溃。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 2016-08-23
        相关资源
        最近更新 更多