1. 程式人生 > >Windows和Linux中搭建PostgreSQL原始碼除錯環境

Windows和Linux中搭建PostgreSQL原始碼除錯環境

本文使用Xming、Putty和VMWare幾款工具,在Windows桌面環境呼叫Ubuntu虛擬機器上的圖形介面進行PostgreSQL原始碼的除錯。文中的所有步驟適合真機Ubuntu系統,只是所有圖形介面的呼叫是在Windows桌面環境下。這樣做,和直接在Ubuntu虛擬機器中進行除錯,並沒有什麼區別,只是我個人比較喜歡Windows下的一些工具的介面,如VISIO2013,Office2013,比起Libreoffice還是要方便美觀很多。如果是linux使用者,可以跳過配置xshell部分即可。

一、配置Eclipse和JAVA環境變數
1、下載jdk並解壓,之後配置系統環境變數
export JAVA_HOME=/opt/jdk1.7.0_60
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

2、下載Eclipse並解壓
在嘗試執行eclipse時,當遇到“No Java virtual machine”的錯誤時,首先確定JAVA環境變數是否正確配置並使之生效了,如果問題依舊,可以通過在Eclipse目錄中建立一個jre的軟連線到jdk的jre目錄即可。
ln -s /opt/jdk1.7.0_60/jre /opt/eclipse/jre

在Putty中配置X11,配置完成後嘗試執行Eclipse,當遇到“connot open display”類似的錯誤時,回到虛擬機器的圖形介面,執行sudo xhost +,問題應該就可以解決了。在Windows中看到Eclipse介面,但是Eclipse的所有字型都非常小,可以通過在xming快捷方式的啟動引數里加上一個引數:-dpi 108。windows預設的dpi是96畫素,建議設定為96的125%或150%。
如:
"C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow -dpi 108

二、配置PostgreSQL原始碼
1、安裝PostgreSQL原始碼除錯所需要的包
sudo apt-get install make gcc g++ gdb tar libreadline6-dev zlib1g-dev bison flex
sudo apt-get install openssl libssl-dev libpam-dev libxml2 libxml2-dev libxslt-dev tcl tcl-dev libperl-dev python python-dev systemtap systemtap-sdt-dev
如果要除錯PostgreSQL原始碼,需要安裝gdb:sudo apt-get install gdb。

2、新增PostgreSQL的系統使用者
sudo adduser postgres

3、在PostgreSQL原始碼目錄中執行configure
如果只打開--enable-debug選項,在gdb裡進行除錯時,會有一些變數的值無法打印出來,這是因為gcc在進行編譯程式碼時,會進行一定程度的優化。為了能夠在除錯跟蹤時看到所有變數的值的變化情況,我們有必要降低甚至取消優化選項:CFLAGS=-o0 --enable-depend --enable-cassert --enable-debug
./configure CFLAGS=-O0 --prefix=/opt/PostgreSQL/9.3.4/ --with-perl --with-python --with-tcl --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt --enable-thread-safety --enable-dtrace --enable-depend --enable-cassert --enable-debug

三、在Eclipse中建立PostgreSQL原始碼工程
1、新建一個Project並匯入PostgreSQL原始碼

Language:選擇C,必須去掉"C++"複選框
Toolchain for Indexer Settings:選擇Linux GCC
單擊"Finash"按鈕。

2、設定Eclipse的Make Target
在除錯PostgreSQL之前,首先需要將其安裝到某個目錄中,在Eclipse中是通過建立一個Make Target實現的。
在工程單擊右鍵,選擇Make Targets-Create,在彈出的"Create Make Target"對話方塊中,Target name文字控制元件的值輸入:install,實際上它要做的就是我們通過原始碼編譯安裝時執行make install命令,單擊OK按鈕完成。

3、編譯安裝PostgreSQL原始碼到目標目錄
在PostgreSQL原始碼工程上單擊右鍵,選擇Make Targets-Build,選擇install,單擊Build。

直到console窗口出現"PostgreSQL installation complete.",表示安裝完成。
此時,在prefix引數指定的安裝目錄下,會生成bin、include、lib和share目錄。

觀察console視窗:

觀察Progress視窗:

看到install完成

檢視安裝目錄:
[email protected]:~$ ls -l /opt/PostgreSQL/9.3.4/
drwxr-xr-x 2 root root 4096 Jul 10 20:57 bin
drwxr-xr-x 4 root root 4096 Jul 10 20:57 include
drwxr-xr-x 4 root root 4096 Jul 10 20:57 lib
drwxr-xr-x 3 root root 4096 Jul 10 20:56 share

4、建立PostgreSQL的data目錄並初始化例項
[email protected]:~$ sudo mkdir /opt/PostgreSQL/9.3.4/data
[email protected]:~$ sudo chown -R postgres.postgres /opt/PostgreSQL/9.3.4/data/
[email protected]:~$ su - postgres
[email protected]:~$ /opt/PostgreSQL/9.3.4/bin/initdb -D /opt/PostgreSQL/9.3.4/data/

四、執行PostgreSQL原始碼工程
初始化成功後,回到Eclipse,在PostgreSQL原始碼專案上單擊右鍵選單Run Configurations

雙擊C/C++ Application,會建立一個名為postgresql-source-9.3.4 Default的配置介面,在C/C++Application文字控制元件中輸入src/backend/postgres

或者點選Search Project...按鈕,選擇postgres

兩種方法都可以。完成後,切換到上圖中紅色箭頭所指的Arguments選項卡,在Program arguments文字控制元件中輸入啟動例項引數-D和資料庫的資料目錄所在:-D /opt/PostgreSQL/9.3.4/data,如下圖所示:

單擊Apply,然後單擊Run,上圖中因為已經點選過Apply按鈕,所以Apply按鈕是禁用狀態。如果這一步遇到Run按鈕是禁用狀態,那可能你使用的不是postgres使用者執行Eclipse,可以切換到postgres使用者試試看。

LOG: database system was shut down at 2014-07-11 02:44:35 CST
LOG: database system is ready to accept connections
LOG: autovacuum launcher started

看到這些資訊,表示資料庫已成功啟動。
檢視postgres程序和相關後臺程序:ps -ef | grep postgres

至此,資料庫已經安裝,啟動成功,可以通過psql連線到資料庫進行測試。
[email protected]:~$ /opt/PostgreSQL/9.3.4/bin/psql -U postgres postgres
點選Console面板右側的紅色Terminate圖示,看到以下輸出即可停止資料庫服務了。
LOG: received smart shutdown request
LOG: autovacuum launcher shutting down

五、除錯PostgreSQL程式碼
1、除錯主程序
資料庫執行成功後,一定要關閉已經開啟的Postmaster程序才能進行除錯,否則會提示"Postmaster已經存在"的錯誤。
單擊工程右鍵,Debug As-Local C/C++ Application,選擇"postgres"作為除錯程式,單擊OK,即可進入除錯模式。

此時程式自動會在main函式處停下,所以要繼續點選工具欄上的"Resume"按鈕(Eclipse預設的快捷鍵F8)讓主程序執行完,否則無法連線資料庫。Debug執行完後會有和執行成功時一樣的提示資訊。
這時的console視窗會有以下輸出:
LOG: database system was interrupted; last known up at 2014-07-12 14:37:56 CST
LOG: database system was not properly shut down; automatic recovery in progress
LOG: record with zero length at 0/178A4A0
LOG: redo is not required
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
2、服務程序(postgres子程序)的除錯
使用psql連線資料庫,檢視當前的程序號:select pg_backend_pid();
注意:記住這個程序號,如15878。

開啟另一個終端,輸入ps -ef | grep sql
發現此時,多了一個程序:
lq 20579 20558 0 22:13 ? 00:00:00 postgres: lq DemoDB [local] idle

回到Eclipse除錯介面,單擊選單Run->Debug Configure,在彈出的Debug Configurations介面,雙擊C/C++ Attach to Application:
配置介面:
Name:postgres
Main選項卡:
C/C++ Application:src/backend/postgres
Project:pgsql
Build configuration:取消"Select configuration...",選擇"Use Active"
單擊Debug,然後會出現一個程序選擇視窗,輸入"post"在程式的程序列表中,選擇程序號(21706)對應的postgres程序。
單擊OK。

在除錯子程序的過程中遇到以下錯誤:
Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
解決方法:
1.可以通過下面的命令對這個限制進行臨時修改,但是重啟後限制依舊存在。
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
2.可以通過修改配置檔案來解除限制(我選擇了這種方式)
sudo vim /etc/sysctl.d/10-ptrace.conf
修改前:
kernel.yama.ptrace_scope = 1
修改後:
kernel.yama.ptrace_scope = 0
重啟之後可以生效。

修改之後重複上述的步驟既可看到已經將除錯工具掛上了這個postgres程序。