主要观点:通过heaptrack
在 Postgres 中调试内存泄漏问题,介绍了postmaster
和客户端后端client backend
中的内存泄漏情况,比较了heaptrack
与memleak
、Valgrind memcheck
、LeakSanitizer
的特点,heaptrack
需进程退出后才打印泄漏报告,但其在报告栈跟踪和行号方面更可靠,heaptrack
和memleak
都是有用的工具。
关键信息:
- 可通过在
postmaster
和client backend
中添加特定代码引入内存泄漏,如在postmaster
的postmaster.c
中添加palloc
分配,在client backend
的pseudorandomfuncs.c
中添加palloc
分配。 - 可通过执行大量
psql
客户端或多次执行random()
函数触发泄漏。 heaptrack
需在 Linux(Mac 上的 Linux VM 也可)上使用,需获取进程 PID 后 attach 到进程进行调试,调试结束后可通过heaptrack_print
生成泄漏报告。
重要细节:TopMemoryContext
中的过度分配(泄漏)在Valgrind memcheck
或LeakSanitizer
中可能不会被捕获,但在heaptrack
中可检测到。- 注释掉分配差异后重新运行
heaptrack
,泄漏报告部分将为空。 heaptrack
在不同环境中报告栈跟踪和行号更可靠,比Valgrind memcheck
或LeakSanitizer
更适合泄漏内存在程序退出前已被清理的情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。