【PostgreSQL資料庫】PostgreSQL資料庫gdb除錯子程序
下面通過,一個關於“GDB除錯PG資料庫CheckPoint子程序”的例子,描述一下GDB除錯PG資料庫子程序的方法。
PG資料庫啟動之後,啟動postmaster父程序,隨後postmaster程序會fock出CheckPoint子程序,下面逐步描述我是怎麼完成除錯的。
本人使用的是14.0版本的原始碼,關於資料庫部署,配置環境的相關操作,這裡不做描述。
1. 原始碼編譯前的準備
PG在原始碼編譯之前,需要首先執行./configure命令(configure檔案在原始碼目錄第一層),在這一步時,就需要開啟除錯功能,然後再編譯:
(1)執行命令:./configure -prefix=/usr/local/pgsql --enable-debug
(2)vi /opt/postgresql-14.0/src/Makefile.global
找到下面這行:
CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -g -O2
上面的行的"-O2"選項刪除,然後加上"-g"。"-O2"是編譯器的優化選項,如果打開了,程式碼的執行順序會改變,使得追蹤起程式碼來比較困難,所以要去除。gdb 除錯程式的時候列印變數值出現<value optimized out>就是由於沒有去掉 “-O2”。
(3)執行命令: make clean all(如果要求root許可權,執行sudo make clean all)
(4)執行命令: make install(本例中,pg預設部署在/usr/local/pgsql目錄下)
此時安裝完成,然後自己確保環境正常安裝,可以建立資料庫了。
2. 建立資料庫
登入你建立的使用者postgres, 建立一個數據庫mydb。
3. GDB除錯
這裡我們嘗試去通過GDB檢視檢查點的一個控制“自動觸發檢查點的時間引數--CheckPointTimeout”的值。
(1)首先檢視postgres的相關程序號
程序ID=30928,對應的是PG的主程序,獲取到主程序號為30928。
(2) 執行GDB
如上執行gdb attach 30928,進入除錯。
(3)打斷點將主程序在fork 檢查點子程序之前掛住
由於postmaster主程序執行時,會在下面的位置處,拉起檢查點子程序,所以此處打上斷點:
斷點如下,然後執行r,重新執行。
(4)然後GDB結果如下:
(5)設定: set follow-fork-mode child
(6)然後在子程序的介面CreteCheckPoint上打上斷點:
執行:b CreateCheckPoint(為了我在會話中執行CHECKPOINT命令,強制建立檢查點時,可以將程序卡在這個位置)
(7)然後執行c,等待程序執行到斷點位置。
(8)開啟會話,執行CHECKPOINT;命令
(9)然後通過p CheckPointTimeout,打印出該引數的值,如上上圖所示。
上面就是探討的方法。方法很多,後續會繼續補充。