PostgreSQLのソース読みたい
PostgreSQLのソースを
読んでみるか。と思った。
参考サイト
PostgreSQL の構造とソースツリー(1)—Let's Postgresから参考。
PosgreSQL9.1.xを読んでみるか。
方法
configure
とりあえずconfigure。--enable-debugをつけるのと同時に、--prefixオプションもつける。
$ ./configure --prefix=$HOME/postgresql/ --enable-debug
src/Makefile.globalを編集。-O2を削除、代わりに-gをつける。
$ vi src/Makefile.global
Makefile.globalがない、と思ったら、configureが生成することに気が付かなかった。
$ make
$ make instal
$ export PGPORT=14333l
$ postgresql/bin/pg_ctl init -D postgresql/data
$ postgresql/bin/pg_ctl start -D postgresql/data
とりあえず、インストールが完了した。psqlを呼びだそう。
$ postgresql/bin/psql postgres
psql (9.1.5)
Type "help" for help.
postgres=# SELECT 1;
?column?
----------
1
(1 row)
psqlを呼び出したら、別のシェルでgdbを呼び出す。
$ ps ax | grep postgres
16863 ? Ss 0:00 postgres: writer process
16864 ? Ss 0:00 postgres: wal writer process
16865 ? Ss 0:00 postgres: autovacuum launcher process
16866 ? Ss 0:00 postgres: stats collector process
16877 pts/1 S+ 0:00 postgresql/bin/psql postgres
16878 ? Ss 0:00 postgres: tekitoh postgres [local] idle
17016 pts/2 S+ 0:00 grep postgres
$ gdb postgres 16878
ブレークポイントを設定する。b 関数名
(gdb) b ExecResult
Breakpoint 1 at 0x8204f46: file nodeResult.c, line 75.
psqlに戻って、SELECT 1;を実行する。SELECT 1;の結果が出ない。
postgres=# SELECT 1;
またgdbに戻ってcを入力すると、ExecResultで止まっているのが分かる。
(gdb) c
Continuing.
Breakpoint 1, ExecResult (node=0xa5cab48) at nodeResult.c:75
75 econtext = node->ps.ps_ExprContext;
(gdb) list
70 TupleTableSlot *resultSlot;
71 PlanState *outerPlan;
72 ExprContext *econtext;
73 ExprDoneCond isDone;
74
75 econtext = node->ps.ps_ExprContext;
76
77 /*
78 * check constant qualifications like (2 > 1), if not already done
79 */
btと入力してそこまでの過程が表示される。
(gdb) bt
#0 0xb764927c in recv () from /lib/libc.so.6
#1 0x08213ebd in secure_read (port=0xa54c758, ptr=0x855a8c0, len=8192) at be-secure.c:304
#2 0x0821da66 in pq_recvbuf () at pqcomm.c:816
#3 0x0821db03 in pq_getbyte () at pqcomm.c:857
#4 0x082df549 in SocketBackend (inBuf=0xbfa54894) at postgres.c:345
#5 0x082df8b4 in ReadCommand (inBuf=0xbfa54894) at postgres.c:467
#6 0x082e3e87 in PostgresMain (argc=2, argv=0xa52fe28, username=0xa52fd48 "tekitoh") at postgres.c:3932
#7 0x0829b336 in BackendRun (port=0xa54c758) at postmaster.c:3617
#8 0x0829a9fb in BackendStartup (port=0xa54c758) at postmaster.c:3302
#9 0x08297c9f in ServerLoop () at postmaster.c:1466
#10 0x08297442 in PostmasterMain (argc=3, argv=0xa52ed58) at postmaster.c:1127
#11 0x0821fc64 in main (argc=3, argv=0xa52ed58) at main.c:199
PostgreSQLのソースディレクトリに戻って、ctagsを作る。ソースコードを追っかけやすくするため。ちなみにvim版。
$ tools/make_ctags
疲れたのでもう寝る。おやすみなさい。
これが1週間前の話。
ついつい、何もしていなかった。