您的位置:首页 > 数据库

在Ubuntu 12.04中使用最新的Eclipse版本调试跟踪最新的PostgreSQL源代码

2013-12-29 19:00 295 查看

1 写在最前

大概三周前就已经想把这篇文章发出来了,但是苦于各种杂事,今天终于有空来整理一下了。进入正题前,我想说的是,目前网上的很多关于PostgreSQL(以下简称PG)源代码分析环境搭建的文章都已经比较”古老“了。旧的一些文档中所说的一些依赖包的安装可能还是多年之前的版本(比如,很多文档中都会说在Ubuntu中需要安装libreadline5-dev包,但实际上该包目前已经不存在,应该转而安装libreadline6-dev包,虽然这个问题在配置时很容易发现,但是作为一个文档来说,还是要力求准确)。即使最新发表的一些,也都大多是作者参照以前的一些文档,配置成功后的一些总结,而且用到的Eclipse版本可能还是按照旧教程中说的较早的版本。对于分析C代码来说,完全可以使用最新的版本。因此,本文给出了一个较为完整详细的环境搭建过程,有些内容可能比较”小白“,但为了保持完整性,也还是都罗列了出来。我保证有很多问题,目前其它任何文档都没有涉及过。有问题欢迎大家指正。

2 系统环境

操作系统:Ubuntu 12.04 LTS (64 bit)

IDE:Eclipse IDE for C/C++ Developers (Kepler)
PostgreSQL版本:9.4 (devel)

3 部署说明

PostgreSQL数据库源代码全部是由C语言编写而成的,源代码中自带了Makefile编译脚本,以供GCC编译器自动处理源码之间的关联。因此在Linux发行版的系统中,配合高效的集成开发环境以进行源代码的分析和调试是十分方便的。

4 搭建步骤

4.1 依赖包的安装

为了能够在系统中从源代码编译安装PostgreSQL,需要首先在安装好的Ubuntu系统中安装一下系统软件:libreadline6-dev、zlib1g-dev、Bison、Flex。安装命令如下所示(以下操作我是在jack用户下完成,这是我从图形界面登陆的用户):

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

如果安装过程中提示找不到或无法安装相应的软件包,可以首先运行以下命令来更新系统的软件仓库:

sudo apt-get update


4.2 创建postgres用户

在Ubuntu中创建新用户可以采用adduser命令(如果你真正理解useradd命令,你也可以使用useradd),该命令会启动一个交互式的会话,帮助创建和设置一些新用户的参数。一般而言,使用如下命令直接创建postgres即可:

sudo adduser postgres

其余的设置采用默认选项即可。

这样创建的postgres用户还不能登陆,需要为其设置密码,命令如下:

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平台中安装Eclipse和Windows平台基本相同,可以到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选择为C。Toolchain for Indexer Settings选择Linux GCC,之后点击Finish。

此时就已经将一个C代码导入到了Eclipse,下面需要在Eclipse中配置make和make 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 over或Step 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,基本上全天在线。所以,即使过了很多年,也不用担心”作者已经不存在“。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: