1

ユーザー定義関数 (postgres のユーザー定義関数の一部である C/C++ で実装されていると呼ばれます) をデバッグしたいと思いますprepareTheOutputRecord。gdb でこれを達成する方法は次のとおりです。

  1. 関数prepareTheOutputRecordは、libMyExtenstion.sopostgresql サーバーの lib ディレクトリにあるファイルにあります。
  2. psql シェルを起動し、プロセスの 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プロセスの実行を続けましたが、ブレークポイントはヒットしませんでした:( . so ファイル (postgres 実行可能ファイルの代わりに) を成功させずにブレークポイントを (マウスをクリックせずに) に設定しようとしまし_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoDataたが、プログラムは kdbg で停止しません:(

4

1 に答える 1

0

問題はkdb、ルート (または postgres) として実行されなかったことだと思います。権限が間違っているため、シンボルが読み込まれなかったため、ブレークポイントが表示されませんでした (また、関数に配置することもできませんでした)。

于 2013-12-03T18:13:20.690 に答える