【问题标题】:How can I get valgrind to tell me the address of each non-freed block of memory?如何让 valgrind 告诉我每个未释放内存块的地址?
【发布时间】:2009-10-08 19:57:46
【问题描述】:

Valgrind 告诉我函数 xxx 分配的内存没有被释放。美好的。然而,事实证明这比平时更难追踪。

为此我创造了无数个:

#ifdef DEBUG
fprintf(stderr, "something happening:%lx\n", (unsigned long)ptr);
#endif

所以我只需要将这些显示的ptr地址与未释放内存的地址进行匹配即可。

如何让 valgrind 告诉我每个未释放内存块的地址?

【问题讨论】:

    标签: memory-leaks valgrind


    【解决方案1】:

    不幸的是,我不相信 Memcheck 的泄漏检查器支持打印地址。这是因为如果它们相似,它愿意将多个未分配的块合并到一个“损失报告”中。

    如果你不介意在 Memcheck 中闲逛,这个功能应该可以添加到 Valgrind 源代码的 memcheck/mc_leakcheck.c 中。等我回家看看,再贴个更详细的位置。

    【讨论】:

      【解决方案2】:

      感谢 Falaina 提供代码位置。

      对于 valgrind-3.2.3,对我有用的位置在 memcheck/mc_leakcheck.c,lc_scan_memory_WRK 函数中。

      在 lc_markstack_push_WRK(addr, clique); 之后添加了这个第 472 行

      if (clique != -1) { VG_(printf)("clique %d: %p\n", clique, ptr); }

      【讨论】:

      • 这需要添加到 memcheck 作为一个适当的选项
      【解决方案3】:

      12 年过去了,但仍然没有添加。以下补丁是@Chaim 对 valgrind-3.18.1 的建议

      diff -uir valgrind-3.18.1/memcheck/mc_leakcheck.c valgrind-3.18.1-new/memcheck/mc_leakcheck.c
      --- valgrind-3.18.1/memcheck/mc_leakcheck.c     2021-01-21 15:09:33.000000000 +0000
      +++ valgrind-3.18.1-new/memcheck/mc_leakcheck.c 2022-03-08 18:55:24.323996739 +0000
      @@ -1166,6 +1166,7 @@
                   }
                } else {
                   lc_push_if_a_chunk_ptr(addr, clique, cur_clique, is_prior_definite);
      +            if (clique != -1) { VG_(printf)("clique %d: %p\n", clique, (void*)ptr); }
                }
             } else if (0 && VG_DEBUG_LEAKCHECK) {
                VG_(printf)("%#lx not valid\n", ptr);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-23
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多