【问题标题】:suppress "possibly lost" errors in valgrind when interior pointer offset is known当内部指针偏移已知时,抑制 valgrind 中的“可能丢失”错误
【发布时间】:2015-01-06 20:07:30
【问题描述】:

我有大量内部指针的代码,我想使用 valgrind 来检测内存泄漏。不幸的是,这意味着我在“可能丢失”类别中得到了很多垃圾。

我在部分代码中使用了自定义内存分配器,它从 malloc 分配块,然后管理块本身。分配器使用正常的内部指针技巧 - 实际应用程序在块头之后接收指向块的内部指针。

因此,如果块在退出时由应用程序持有,则报告为“可能丢失”,因为应用程序持有指向该块的内部指针。但是,我知道标头大小,所以理论上可以推导出起始指针。

有没有办法告诉 valgrind 忽略距起始指针已知偏移量的内部指针,以便我可以检查应用程序中的泄漏?

【问题讨论】:

    标签: c++ c valgrind


    【解决方案1】:

    您也许可以使用 valgrind 的抑制文件功能来实现您的目标。您可以指出不应报告最初由分配函数创建的“可能丢失”的内存块。

    但是,如果 valgrind 无法找到任何指针,它仍会将该块报告为“肯定丢失”。

    有关如何创建抑制文件的更多信息,请参阅 valgrind 的文档。

    【讨论】:

      【解决方案2】:

      Valgrind 有几种启发式方法将内部指针视为“真正的指针”。 这些启发式被激活

      --leak-check-heuristics=heur1,heur2,... which heuristics to use for
              improving leak search false positive [none]
              where heur is one of:
                stdstring length64 newarray multipleinheritance all none
      

      其中一种启发式方法可能与您的情况相符。 或者,您将不得不修改 valgrind 启发式逻辑以添加您的 自己的具体案例(文件 memcheck/mc_leakcheck.c 函数 heuristic_reachedness)

      如果您要添加的逻辑足够通用, 最好的办法是提交描述所需启发式方法的 valgrind 错误(严重性要求)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-05
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        相关资源
        最近更新 更多