PostgreSQL大量使用内存池,当启用Valgrind时,使用VALGRIND_CREATE_MEMPOOL
等向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 mempools的界面似乎没有对名称进行任何引用。 PostgreSQL的mempools在其标题块中嵌入了名称,因此只需要教授Valgrind的字节范围是池名称。
我错过了什么或者现在这是不可能的吗?
可行的替代方案可能是程序回调,以过滤泄漏检查报告或向其添加注释信息。但我再也没有看到Valgrind的任何暗示这是可能的。
这似乎是其他人想要的东西,所以也许我只是没有看到这样做的方式。
上下文:我怀疑某个地方的分配应该在缓存中,但它是在PostgreSQL的TopMemoryContext
中分配的。因此,它应该在缓存中超过它应该被销毁的部分。