1

我想调试一个用户定义的函数(prepareTheOutputRecord在 C/C++ 中调用,它是 postgres 中用户定义函数的一部分。以下是我使用 gdb 实现此目的的方法:

  1. 该函数prepareTheOutputRecord位于libMyExtenstion.sopostgresql 服务器的 lib 目录中的文件中
  2. 我启动 psql shell,检索进程的 pid

    postgres=# SELECT pg_backend_pid();
    pg_backend_pid
    - - - - - - - - - - - - - - 
        4120
    (1 row)
    
  3. 使用附加的 pid 运行 gdb:

    gdb -p 4120
    
  4. 现在搜索 .so 文件,该函数是如何被准确调用的:

    nm -as libMyExtenstion.so | grep prepareTheOputRecord 
    00000000002633fe t _ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData
    
  5. 在 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
    
  6. 执行 psql 中的 SQL。在某个点,断点在 gdb 中被命中:

    Breakpoint 1, prepareTheOutputRecord (this=0x1116410, fcinfo=0x7fff3a41e150)
    at ../Dir/file.cpp:1736
    1736        funcctx = SRF_PERCALL_SETUP();
    (gdb) 
    
  7. 继续调试代码。

我想在 kdbg 中做同样的事情。为此,我加载了 postgres 可执行文件,附加到进程,加载了 cpp 文件,用鼠标在函数处设置断点,继续执行 postgres 进程,但断点从未命中:(我重复了相同的 .所以文件(而不是postgres可执行文件)没有任何成功。我什至尝试将断点设置为_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData(没有鼠标点击)但程序不会在kdbg中停止:(

4

1 回答 1

0

我相信问题在于kdb没有以root(或postgres)身份运行。由于权限错误,未加载符号,因此未显示断点(也不允许放置在函数处)

于 2013-12-03T18:13:20.690 回答