GNUデバッガ(GDB)で起動中のプロセスにアタッチしてSharedObject(.so)をトレースするテストをしてみました。
やりたかったのは、下記で作成したPostgreSQLの拡張機能(spitest01.so)のデバッグです。
「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-debugmake
make installuseradd –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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include "postgres.h" #include "fmgr.h" #include "executor/spi.h" #include "catalog/pg_type.h" PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(spitest01); Datum spitest01(PG_FUNCTION_ARGS) { SPITupleTable *tuptable; HeapTuple tup; TupleDesc desc; Oid argtypes[2] = { INT8OID, INT8OID }; Datum params[2]; char nulls[2] = { ' ', ' '}; SPI_connect(); SPI_execute("SELECT * FROM spitest01_tbl", false, 0); tuptable = SPI_tuptable; desc = tuptable->tupdesc; tup = tuptable->vals[0]; elog(LOG, "[col1=%s][col2=%s]", SPI_getvalue(tup, desc, 1), SPI_getvalue(tup, desc, 2)); tup = tuptable->vals[1]; elog(LOG, "[col1=%s][col2=%s]", SPI_getvalue(tup, desc, 1), SPI_getvalue(tup, desc, 2)); SPI_finish(); PG_RETURN_BOOL(true); } |
実行画面のスクリーンショット。
psqlから接続したときに、生成されるプロセスを対象にします。
psコマンドで確認したプロセスidにアタッチします。
break spitest01 により、この関数にブレイクポイントを設定します。
psqlで関数を呼び出した後(call spitest01())、next(n)コマンドでトレースを開始しました。(いきなり目的の関数にとばなかったので、finで関数を終了させながら到達させました。要調査)
continueするとpsql側はCALLを表示しました。
/home/postgres/db.logも確認
(gdb上で関数をコールして表示させるつもりでしたが、忘れてました・・)
以上、備忘録でした。