Valgrind Memcheck for PostgreSQL C 函数
Posted
技术标签:
【中文标题】Valgrind Memcheck for PostgreSQL C 函数【英文标题】:Valgrind Memcheck for PostgreSQL C function 【发布时间】:2015-10-01 00:05:34 【问题描述】:我为 PostgreSQL 写了一个 C 语言函数。它将 OpenStreetMap 中的数据导入到我自己的数据库中,但似乎我在某处发生了内存泄漏。我试图用 valgrind 检查它:
LD_PRELOAD='/some/path/libohdm-import.so' valgrind --leak-check=full psql ohdm-dev -c "select ohdmImport('somefile.osm');"
但每次我收到以下错误:
valgrind: symbol lookup error: /some/path/libohdm-import.so: undefined symbol: SPI_processed
我从 postgres 正确导入了头文件。该函数成功完成了斐济群岛等较小的地图数据,但较大的地图数据出现内存不足。
我的问题是:如何让 valgrind 运行?
【问题讨论】:
你在使用 palloc() (in line#42) 吗? 【参考方案1】:除了错误,这根本行不通。您在psql
客户端应用程序上运行valgrind
,但希望它检查服务器后端上的内存错误。您的代码未加载到 psql
和 valgrind
无法在那里检查。有点像在跟踪apache
中的崩溃时在chrome
上启动调试器......
您需要在 valgrind 下启动 PostgreSQL 服务器。您应该使用 PostgreSQL 在src/tools/valgrind.supp
中提供的 valgrind 抑制文件,例如--suppressions=/path/to/postgresql/sources/src/tools/valgrind.supp
.
您不能将 valgrind memcheck 附加到现有进程,因为它需要从启动时跟踪进程状态。由于 PostgreSQL 后端来自 postmaster 的 fork()
,valgrind 必须跟踪自 postmaster 启动以来的所有内容。您必须跟踪整个数据库服务器。
请参阅PostgreSQL wiki on valgrind。特别要注意有助于提供更好的 valgrind 结果的编译选项。
顺便说一句,PostgreSQL 使用分层内存上下文,您可以通过 palloc
、pfree
、MemoryContextAlloc
、SetMemoryContext
等访问它。如果要将其传递给,则应该只使用 malloc
内存另一个库将free
它,或者您正在使用的库free
ing 内存malloc
d。对于 PostgreSQL 后端代码,使用 PostgreSQL 分配器,以便在异常终止函数等时自动清理内存。
【讨论】:
我忘记了...(我的)postgresql 是 9.1.18 而不是 9.4,所以我在源代码中没有 valgrind.supp 而且我无法升级,因为我不是服务器admin 我正在使用 palloc 和 pfree 好的...发现内存泄漏...使用了分配内存的 xml 读取器库中的 2 个函数...。但仍然感谢您的帮助,我会记住您写的内容以上是关于Valgrind Memcheck for PostgreSQL C 函数的主要内容,如果未能解决你的问题,请参考以下文章
在 linux 上查找泄漏的替代 valgrind (memcheck)? [关闭]
Valgrind无法在Android OS上执行memcheck工具?
如何在不通过 valgrind 命令选项启动 Process 的每个实例的情况下对每个实例进行 valgrind memcheck