Attach to Process / GDB

GNUデバッガ(GDB)で起動中のプロセスにアタッチしてSharedObject(.so)をトレースするテストをしてみました。
やりたかったのは、下記で作成したPostgreSQLの拡張機能(spitest01.so)のデバッグです。

「Server Programming Interface」

Server Programming Interface

上記環境との違いは、バージョンが12.2でビルドをソースコードからしていることです。
ビルドするときはデバッグオプションを付けます。

インストール
root user

apt-get install build-essential
apt-get install libreadline-dev zlib1g-dev
cd /usr/local/src/
wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz
tar zxf postgresql-12.2.tar.gz
cd postgresql-12.2
mkdir tempd
cd tempd
/usr/local/src/postgresql-12.2/configure –prefix=/opt/postgresql12 –enable-debug

make
make install

useradd –create-home –home-dir /home/postgres postgres

DBの初期化、起動、停止
postgres user

export PATH=/opt/postgresql12/bin:$PATH

pg_ctl –pgdata=/home/postgres/data initdb

pg_ctl –pgdata=/home/postgres/data –log=/home/postgres/db.log start
pg_ctl –pgdata=/home/postgres/data stop

下記コードのビルド・インストールは上記サイト参考
(パスの差異はpg_config –pgxsが吸収)

spitest01.c

実行画面のスクリーンショット。
psqlから接続したときに、生成されるプロセスを対象にします。
psコマンドで確認したプロセスidにアタッチします。
break spitest01 により、この関数にブレイクポイントを設定します。


psqlで関数を呼び出した後(call spitest01())、next(n)コマンドでトレースを開始しました。(いきなり目的の関数にとばなかったので、finで関数を終了させながら到達させました。要調査)
continueするとpsql側はCALLを表示しました。

/home/postgres/db.logも確認

(gdb上で関数をコールして表示させるつもりでしたが、忘れてました・・)

以上、備忘録でした。