VALGRIND_CREATE_MEMPOOL
PostgreSQL 大量使用内存池,并且在启用 Valgrind 时,使用等向 Valgrind 提供有关它们的信息。
结合使用客户端请求的增量泄漏检查VALGRIND_DO_LEAK_CHECK
,VALGRIND_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 内存池的界面似乎没有提及名称。PostgreSQL 的内存池在其标题块中嵌入了名称,因此只需教 Valgrind 什么字节范围是池名称即可。
我错过了什么还是现在不可能?
一个可行的替代方案可能是程序回调来过滤泄漏检查报告或向它们添加注释信息。但我再次在 Valgrind 中看不到任何表明这是可能的东西。
这似乎是其他人想要的东西,所以也许我只是没有看到这样做的方法。
上下文:我怀疑某个分配应该在缓存中,但它是在 PostgreSQL 中分配的TopMemoryContext
。所以它的寿命超过了它应该被销毁的缓存。