Windows和Linux中搭建PostgreSQL源碼調試環境

本文使用Xming、Putty和VMWare幾款工具,在Windows桌面環境調用Ubuntu虛擬機上的圖形界面進行PostgreSQL源碼的調試。文中的全部步驟適合真機Ubuntu系統,只是全部圖形界面的調用是在Windows桌面環境下。這樣作,和直接在Ubuntu虛擬機中進行調試,並無什麼區別,只是我我的比較喜歡Windows下的一些工具的界面,如VISIO2013,Office2013,比起Libreoffice仍是要方便美觀不少。若是是linux用戶,能夠跳過配置xshell部分便可。python

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

二、下載Eclipse並解壓
在嘗試運行eclipse時,當遇到「No Java virtual machine」的錯誤時,首先肯定JAVA環境變量是否正確配置並使之生效了,若是問題依舊,能夠經過在Eclipse目錄中創建一個jre的軟鏈接到jdk的jre目錄便可。
ln -s /opt/jdk1.7.0_60/jre /opt/eclipse/jresql

在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 108shell

2、配置PostgreSQL源碼
一、安裝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。數據庫

二、添加PostgreSQL的系統用戶
sudo adduser postgresvim

三、在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-debugwindows

3、在Eclipse中創建PostgreSQL源碼工程
一、新建一個Project並導入PostgreSQL源碼eclipse

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

二、設置Eclipse的Make Target
在調試PostgreSQL以前,首先須要將其安裝到某個目錄中,在Eclipse中是經過創建一個Make Target實現的。
在工程單擊右鍵,選擇Make Targets-Create,在彈出的"Create Make Target"對話框中,Target name文本控件的值輸入:install,實際上它要作的就是咱們經過源碼編譯安裝時執行make install命令,單擊OK按鈕完成。工具

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

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

觀察console窗口:

觀察Progress窗口:

看到install完成

查看安裝目錄:
vincent@devpc:~$ 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

四、建立PostgreSQL的data目錄並初始化實例
vincent@devpc:~$ sudo mkdir /opt/PostgreSQL/9.3.4/data
vincent@devpc:~$ sudo chown -R postgres.postgres /opt/PostgreSQL/9.3.4/data/
vincent@devpc:~$ su - postgres
postgres@devpc:~$ /opt/PostgreSQL/9.3.4/bin/initdb -D /opt/PostgreSQL/9.3.4/data/

4、運行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鏈接到數據庫進行測試。
postgres@devpc:~$ /opt/PostgreSQL/9.3.4/bin/psql -U postgres postgres
點擊Console面板右側的紅色Terminate圖標,看到如下輸出便可中止數據庫服務了。
LOG: received smart shutdown request
LOG: autovacuum launcher shutting down

5、調試PostgreSQL代碼
一、調試主進程
數據庫運行成功後,必定要關閉已經開啓的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
二、服務進程(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進程。

相關文章
相關標籤/搜索