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 使用分层内存上下文,您可以使用 palloc
、pfree
、MemoryContextAlloc
、SetMemoryContext
等访问它。您应该只 malloc
内存,如果你要将它传递给另一个将 free
它的库,或者你正在 free
ing 内存 malloc
d 你正在使用的库。对于 PostgreSQL 后端代码,使用 PostgreSQL 分配器,以便在异常终止函数等情况下自动清理内存。
我为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 使用分层内存上下文,您可以使用 palloc
、pfree
、MemoryContextAlloc
、SetMemoryContext
等访问它。您应该只 malloc
内存,如果你要将它传递给另一个将 free
它的库,或者你正在 free
ing 内存 malloc
d 你正在使用的库。对于 PostgreSQL 后端代码,使用 PostgreSQL 分配器,以便在异常终止函数等情况下自动清理内存。