錯誤資訊的擷取途徑有幾種 :
1. 最簡單的就是看PostgreSQL的log檔案.
2. 在PostgreSQL中可以使用psql的 \set VERBOSITY verbose 來輸出詳細的錯誤資訊,
3. 或者使用linux的strace跟蹤這個發生錯誤的程序.
4. 使用gdb (GNU Debugger) 來調試則是一種比較深入但是非常有用的工具.
下面就以前面我在使用pgsql_fdw時遇到的問題使用gdb來做個簡單的示範 :
要讓postgresql能夠使用gdb進行調試, 首先要在編譯PostgreSQL時打開enable-debug.
例如, 使用如下方法編譯 :
在滿足這個條件後, 初始化資料庫
使用gdb進行調試 :
會話1 :
擷取目前程序的pid.
會話2 :
使用gdb, 綁定到會話1擷取到的程序PID.
在出錯的函數處設定斷點(b getTypeOutputInfo) :
執行那個報錯的函數 :
繼續執行(c), 跟蹤到getTypeOutputInfo的輸入參數如下 :
檢視截止到斷點前的所有調用(bt或backtrace) :
注意這裡的結果和實際的調用順序是反的, 如, #1的execute_query調用了#0的getTypeOutputInfo
其他常用gdb指令 :
next
nexti
【參考】
1. (gdb) 是gdb的指令行提示符.
2. http://en.wikipedia.org/wiki/GNU_Debugger
3. http://wiki.postgresql.org/wiki/Pgsrcstructure
4. gdb 所有指令 :
(gdb) help all