Valgrind Memcheck for PostgreSQL C 函数

Valgrind Memcheck for PostgreSQL C function

我为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 达到 运行?

撇开错误不谈,这根本行不通。您在 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 后端 fork() 来自 postmaster,valgrind 必须跟踪自 postmaster 启动以来的所有内容。您必须跟踪整个数据库服务器。

PostgreSQL wiki on valgrind。特别要注意有助于提供更好的 valgrind 结果的编译选项。

顺便说一句,PostgreSQL 使用分层内存上下文,您可以使用 pallocpfreeMemoryContextAllocSetMemoryContext 等访问它。您应该只 malloc 内存,如果你要将它传递给另一个将 free 它的库,或者你正在 freeing 内存 mallocd 你正在使用的库。对于 PostgreSQL 后端代码,使用 PostgreSQL 分配器,以便在异常终止函数等情况下自动清理内存。