ユーザー定義関数 (postgres のユーザー定義関数の一部である C/C++ で実装されていると呼ばれます) をデバッグしたいと思いますprepareTheOutputRecord
。gdb でこれを達成する方法は次のとおりです。
- 関数
prepareTheOutputRecord
は、libMyExtenstion.so
postgresql サーバーの lib ディレクトリにあるファイルにあります。 psql シェルを起動し、プロセスの 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プロセスの実行を続けましたが、ブレークポイントはヒットしませんでした:( . so ファイル (postgres 実行可能ファイルの代わりに) を成功させずにブレークポイントを (マウスをクリックせずに) に設定しようとしまし_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData
たが、プログラムは kdbg で停止しません:(