1. 程式人生 > 其它 >【PostgreSQL資料庫】PostgreSQL資料庫gdb除錯子程序

【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,打印出該引數的值,如上上圖所示。

        上面就是探討的方法。方法很多,後續會繼續補充。