有没有办法在valgrind memcheck中命名mempools?

时间:2018-02-19 07:46:33

标签: c postgresql valgrind memcheck

PostgreSQL大量使用内存池,当启用Valgrind时,使用VALGRIND_CREATE_MEMPOOL等向Valgrind提供有关它们的信息。

结合使用VALGRIND_DO_LEAK_CHECKVALGRIND_DO_ADDED_LEAK_CHECK等客户端请求进行增量泄漏检查,这对于在大型,复杂且长期存在的程序中跟踪内存使用非常有用。

但是:PostgreSQL有很多缓存,其生命周期往往跨越典型的边界,如事务。这种缓存中的内存通常很容易泄漏(出于各种原因),但如果只使用堆栈在缓存上下文中分配这样的内存,则并不总是很容易识别。

所以我正在寻找一种在泄漏报告中显示内存池名称的方法,并在抑制中过滤它们。理想情况下像

# Do not copy, this DOES NOT WORK
{
   my_suppression_name
   Memcheck:Leak
   match-leak-kinds: reachable
   pool:CacheMemoryContext           # <---- something like this
   fun:malloc
   fun:AllocSetAlloc
   fun:palloc
   fun:initStringInfo
   fun:apply_work
   ...
}

或泄漏报告,如下:

... 6 (+6) bytes in 1 (+1) blocks are possibly lost in loss record 180 of 942
...    in mempool "CacheMemoryContext"                   <---- Like this
...    at 0x815FFC: MemoryContextAlloc (mcxt.c:771)
...    by 0x817680: MemoryContextStrdup (mcxt.c:1157)

我怀疑答案是“不”,因为注册Valgrind mempools的界面似乎没有对名称进行任何引用。 PostgreSQL的mempools在其标题块中嵌入了名称,因此只需要教授Valgrind的字节范围是池名称。

我错过了什么或者现在这是不可能的吗?

可行的替代方案可能是程序回调,以过滤泄漏检查报告或向其添加注释信息。但我再也没有看到Valgrind的任何暗示这是可能的。

这似乎是其他人想要的东西,所以也许我只是没有看到这样做的方式。

上下文:我怀疑某个地方的分配应该在缓存中,但它是在PostgreSQL的TopMemoryContext中分配的。因此,它应该在缓存中超过它应该被销毁的部分。

0 个答案:

没有答案