在Ubuntu 12.04中使用最新的Eclipse版本調試跟蹤最新的PostgreSQL源代碼

1 寫在最前

大概三週前就已經想把這篇文章發出來了,可是苦於各類瑣事,今天終於有空來整理一下了。進入正題前,我想說的是,目前網上的不少關於PostgreSQL(如下簡稱PG)源代碼分析環境搭建的文章都已經比較」古老「了。舊的一些文檔中所說的一些依賴包的安裝可能仍是多年以前的版本(好比,不少文檔中都會說在Ubuntu中須要安裝libreadline5-dev包,但實際上該包目前已經不存在,應該轉而安裝libreadline6-dev包,雖然這個問題在配置時很容易發現,可是做爲一個文檔來講,仍是要力求準確)。即便最新發表的一些,也都大可能是做者參照之前的一些文檔,配置成功後的一些總結,並且用到的Eclipse版本可能仍是按照舊教程中說的較早的版本。對於分析C代碼來講,徹底可使用最新的版本。所以,本文給出了一個較爲完整詳細的環境搭建過程,有些內容可能比較」小白「,但爲了保持完整性,也仍是都羅列了出來。我保證有不少問題,目前其它任何文檔都沒有涉及過。有問題歡迎你們指正。 linux

2 系統環境

操做系統:Ubuntu 12.04 LTS (64 bit) git

IDEEclipse IDE for C/C++ Developers (Kepler) sql

PostgreSQL版本:9.4 (devel)

3 部署說明

PostgreSQL數據庫源代碼所有是由C語言編寫而成的,源代碼中自帶了Makefile編譯腳本,以供GCC編譯器自動處理源碼之間的關聯。所以在Linux發行版的系統中,配合高效的集成開發環境以進行源代碼的分析和調試是十分方便的。 shell

4 搭建步驟

4.1 依賴包的安裝

爲了可以在系統中從源代碼編譯安裝PostgreSQL,須要首先在安裝好的Ubuntu系統中安裝一下系統軟件:libreadline6-devzlib1g-devBisonFlex。安裝命令以下所示(如下操做我是在jack用戶下完成,這是我從圖形界面登錄的用戶): 數據庫

sudo apt-get install libreadline6-dev zlib1g-dev bison flex

若是安裝過程當中提示找不到或沒法安裝相應的軟件包,能夠首先運行如下命令來更新系統的軟件倉庫:  vim

sudo apt-get update

4.2 建立postgres用戶

Ubuntu中建立新用戶能夠採用adduser命令(若是你真正理解useradd命令,你也可使用useradd),該命令會啓動一個交互式的會話,幫助建立和設置一些新用戶的參數。通常而言,使用以下命令直接建立postgres便可: bash

sudo adduser postgres

其他的設置採用默認選項便可。 服務器

這樣建立的postgres用戶還不能登錄,須要爲其設置密碼,命令以下: eclipse

sudo passwd postgres
在輸入該命令後,會提示輸入想要爲postgres用戶設定的密碼,確認以後即完成了對postgres用戶的建立。

這裏之因此創建postgres用戶,是爲了知足PostgreSQL對權限的相關要求,更重要的是,後期安裝好PostgreSQL後,會默認建立postgres數據庫。使用postgres用戶,能夠直接登陸到該數據庫。 函數

能夠看到在/home下出現了postgres的家目錄,後續的相關文件均可以放到postgres家目錄下,以知足PostgreSQL數據庫的權限要求。

使用xhost命令以容許系統中的其它用戶打開圖形界面程序:

xhost +

你能夠看一下運行該命令後,所輸出的提示就明白了。

若是沒有使用這個命令,則postgres用戶沒法在終端中啓動Eclipse。若是你直接在圖形界面中啓動eclipse,那是以圖形界面的登錄用戶(jack)的身份來啓動的,這不是咱們指望的,咱們但願Eclipse也是由postgres用戶啓動的。

切換至postgres用戶:

su – postgres
後續的全部操做都是在postgres用戶的終端環境中操做的。切換用戶時請使用」su -「的形式,不要忘記那個短鏈接線,關於不加短線和加了短線的區別,你們能夠自行google搜索一下,這裏面仍是有不少問題值得研究的,我以前發起過一個討論,其實目前也沒有很好解決,有興趣的也能夠一塊兒討論一下(http://www.oschina.net/question/217269_136637)。

4.3 安裝Eclipse

Linux平臺中安裝EclipseWindows平臺基本相同,能夠到Eclipse的官方網站上下載最新版本的Eclipse壓縮包(*.tar.gz)。以後,切換到壓縮包所在的目錄,用如下命令將Eclipse解壓到postgres用戶的家目錄:

tar xzvf eclipse-cpp-kepler-SR1-linux-gtk-x86_64.tar.gz /home/postgres/

4.4 安裝JDK

能夠在Oracle官網下載最新版本的JDK,仿照安裝Eclipse的方式,將下載的壓縮包解壓到postgres用戶的家目錄:

tar xzvf jdk-7u45-linux-x64.tar.gz /home/postgres/
這裏說個題外話,對於目前我所遇到的大部分應用來講,使用系統自帶的OpenJDK或者說你用apt-get直接下載OpenJDK來使用是徹底沒有問題的,其實我之前一直是不肯意單獨去下JDK配置。這裏之因此這樣作,也是爲了便於管理,所有所需的都放在了postgres家目錄中。

4.5 配置環境變量

Linux系統中配置環境變量能夠保證用戶在終端中很是方便的使用一些命令以及輔助某些軟件的啓動(如Eclipse)。具體方法以下:

另開一個終端,默認應該是你圖形界面登錄的那個用戶(之因此不用postgres用戶,是由於postgres用戶尚未sudo權限,並且Ubuntu中,若是你以前沒有設置過root密碼,默認的root密碼是隨機值,你還沒法直接切換到root。再且,Ubuntu不建議直接使用root用戶登錄)。

使用以下命令(若是你沒安裝過vim,使用vi也能夠):

sudo vim /etc/profile
打開並修改 /etc/profile文件,在其最後添加以下幾行:
export JAVA_HOME=/home/postgres/jdk1.7.0_45
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPAH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export PGDATA=/home/postgres/pgdata

這裏之因此使用/etc/profile文件是爲了解決上一節的那個連接裏提到的切換用戶問題,若是你在/.bashrc裏修改環境變量的話,在切換用戶時就會發現PATH環境變量的內容始終不是你想要的。這個問題仍是但願之後能研究明白。

4.6 獲取PostgreSQL的源代碼

PostgreSQL的源代碼目前是經過Git來進行版本管理的,能夠直接經過git命令來獲取其完整的源代碼。

首先在postgres用戶的家目錄下建立project文件夾用來保存postgres的源代碼,以後經過git來下載源代碼:

mkdir project
cd project
git clone git://git.postgresql.org/git/postgresql.git

4.7 編譯PostgreSQL源代碼

在使用Eclipse進行源代碼編譯前,須要在終端下對源代碼進行預先的配置:

cd /home/postgres/project/postgresql
./configure –-prefix=/home/postgres --enable-depend –-enable-cassert --enable-debug

完成這一步以後,能夠進入到eclipse目錄下,啓動eclipse

cd /home/postgres/eclipse
./eclipse

Eclipse主界面中,點擊File -> Import。在Import對話框中選擇C/C++ -> Existing Code as Makefile Project。以後在彈出的對話框中選擇以前下載的postgresql目錄,而且將Languages選擇爲CToolchain for Indexer Settings選擇Linux GCC,以後點擊Finish

此時就已經將一個C代碼導入到了Eclipse,下面須要在Eclipse中配置makemake install命令。

右鍵postgresql工程目錄,選擇Make Targets –> Create…,在彈出的對話框中的Target name中填寫all。用一樣的方法,再建立一個Target,在其Target name中填寫install

以後右鍵postgresql工程目錄,選擇Make Targets –> Build…,先選擇all,點擊Build。這樣會開始對postgresql的源代碼進行編譯。完成以後,再打開該對話框,選擇install,即將postgresql的相關可執行程序安裝到了/home/postgresql目錄下。 

4.8 跟蹤調試PostgreSQL源代碼

在安裝完成PostgreSQL的源代碼以後,須要首先對數據庫進行初始化:

cd /home/postgres
initdb

這樣,PostgreSQL數據庫即根據以前設置的PGDATA環境變量,在/home/postgres/pgdata目錄中初始化了數據目錄。

接下來在Eclipse中右鍵postgresql工程,點擊Debug As -> Debug Configurations…。在彈出的對話框中選擇C/C++ Application,以後點擊建立圖標(New launch configuration)進入到配置界面。在Main選顯卡中的C/C++ Application裏輸入src/backend/postgres,在Arguments選項卡中輸入-D /home/postgres/pgdata。最後點擊Debug即啓動了服務器端的進程。因爲是Debug模式,程序會在main函數處停下,此時能夠繼續點擊調試工具欄的Step overStep into按鈕一步一步地將主程序運行完。

運行完後,會提示等待客戶端的鏈接。

此時能夠在命令行中輸入psql,便可登錄到默認的postgres數據庫。以後但願可以跟蹤在終端中輸入的查詢語句的。爲此須要在登錄至psql後,輸入以下的查詢語句,以查看該後臺進程的pid

select pg_backend_pid();

這樣會顯示出當前進程的進程號。

回到Eclipse後,在調試界面裏單機Run –> Debug configurations -> C/C++ Attach To Application,而後點擊建立圖標。在彈出的對話框中,C/C++ Application依然填寫postgres程序的地址src/backend/postgres,也能夠寫絕對路徑:

/home/postgres/project/postgresql/src/backend/postgres

而後點擊Debug按鈕,會出現一個進程選擇窗口,選擇以前查看的進程號所對應的postgres進程。點擊OK後,便可以在調試界面看到已經將調試工具(GDB)掛上了這個postgres進程。

以後就能夠再代碼中經過添加斷點,或者即便不添加斷點,經過調試工具,一步一步地跟蹤語句的執行過程,以及後臺程序的運做方式。

5 寫在最後

因爲個人Ubuntu是裝在另一臺臺式機上,再加上時間過得有點長,因此關於Eclipse調試的那一部分略顯單調,不過我已經用我認爲比較完整的文字敘述出了操做過程,若是有問題,能夠評論或留言,我都會幫助一塊兒討論解答。我天天都會登錄OSC,基本上全天在線。因此,即便過了不少年,也不用擔憂」做者已經不存在「。

相關文章
相關標籤/搜索