我想调试一个用户定义的函数(prepareTheOutputRecord
在 C/C++ 中调用,它是 postgres 中用户定义函数的一部分。以下是我使用 gdb 实现此目的的方法:
- 该函数
prepareTheOutputRecord
位于libMyExtenstion.so
postgresql 服务器的 lib 目录中的文件中 我启动 psql shell,检索进程的 pid
postgres=# SELECT pg_backend_pid(); pg_backend_pid - - - - - - - - - - - - - - 4120 (1 row)
使用附加的 pid 运行 gdb:
gdb -p 4120
现在搜索 .so 文件,该函数是如何被准确调用的:
nm -as libMyExtenstion.so | grep prepareTheOputRecord 00000000002633fe t _ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData
在 gdb 中设置断点并运行程序:
(gdb) b _ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData Function "_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData" not defined. Make breakpoint pending on future shared library load? (y or [n]) y Breakpoint 1 (_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData) pending. (gdb) c
执行 psql 中的 SQL。在某个点,断点在 gdb 中被命中:
Breakpoint 1, prepareTheOutputRecord (this=0x1116410, fcinfo=0x7fff3a41e150) at ../Dir/file.cpp:1736 1736 funcctx = SRF_PERCALL_SETUP(); (gdb)
继续调试代码。
我想在 kdbg 中做同样的事情。为此,我加载了 postgres 可执行文件,附加到进程,加载了 cpp 文件,用鼠标在函数处设置断点,继续执行 postgres 进程,但断点从未命中:(我重复了相同的 .所以文件(而不是postgres可执行文件)没有任何成功。我什至尝试将断点设置为_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData
(没有鼠标点击)但程序不会在kdbg中停止:(