• 在Ubuntu 14.04上使用Eclipse开发和调试PosgreSQL9.3.4


    0.准备阶段
    新增PG帐号,用于初始化、启动和关闭数据库
    sudo groupadd postgres
    sudo useradd -g postgres -m postgres
    sudo passwd postgres

    为postgres用户组指定sudo权限:
    ll /etc/sudoers
    sudo chmod 740 /etc/sudoers
    ll /etc/sudoers
    sudo vim /etc/sudoers
    在%sudo处添加:
    %postgres ALL=(ALL:ALL) ALL
    将文件权限改回去:
    sudo chmod 440 /etc/sudoers

    使postgres用户的bash生效:
    sudo vim /etc/passwd
    修改postgres行:
    postgres:x:1001:1001::/home/postgres:

    postgres:x:1001:1001::/home/postgres:/bin/bash

    创建数据库的数据目录并设置其权限:
    sudo mkdir -p /db/pgdata
    sudo chown -R postgres:postgres /db/pgdata

    以postgres身份登录到Ubuntu。

    1.下载并安装JDK
    下载JDK(~/software):jdk-8u5-linux-i586.tar.gz
    解压:
    cd /opt
    sudo mkdir jdk
    sudo cp -r ~/software/jdk-8u5-linux-i586.tar.gz /opt/jdk
    cd jdk
    sudo tar zxvf jdk-8u5-linux-i586.tar.gz

    设置全局的环境变量:
    sudo vim /etc/profile
    在文件最后增加:
    export JAVA_HOME=/opt/jdk/jdk1.8.0_05
    export JRE_HOME=$JAVA_HOME/jre
    export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

    立即生效:source /etc/profile

    将系统默认的jdk修改过来
    sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_05/bin/java 300
    sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_05/bin/javac 300
    sudo update-alternatives --config java
    sudo update-alternatives --config javac
    检测
    java -version

    2.下载并安装Eclipse
    (1)http://www.eclipse.org/下载Eclipse C/C++的Linux版本(~/software):eclipse-cpp-kepler-SR2-linux-gtk.tar.gz
    解压缩:(当前目录/opt/jdk)
    cd ..
    sudo tar zxvf ~/software/eclipse-cpp-kepler-SR2-linux-gtk.tar.gz
    生成eclipse目录。

    在Ubuntu中启动终端,进入该目录启动Eclipse:
    postgres@lq-pc:~$ cd /opt/eclipse/
    postgres@lq-pc:/opt/eclipse$ ./eclipse
    选择workspace工作目录为:/home/postgres/workspace


    (2)配置代码
    再打开一个终端:
    安装组件:
    postgres@lq-pc:~$ sudo apt-get install make gcc g++ tar libreadline6-dev zlib1g-dev bison flex
    postgres@lq-pc:~$ sudo apt-get install openssl libssl-dev
    postgres@lq-pc:~$ sudo apt-get install libpam-dev
    postgres@lq-pc:~$ sudo apt-get install libxml2 libxml2-dev
    postgres@lq-pc:~$ sudo apt-get install  libxslt-dev
    postgres@lq-pc:~$ sudo apt-get install tcl tcl-dev
    postgres@lq-pc:~$ sudo apt-get install libperl-dev
    postgres@lq-pc:~$ sudo apt-get install python python-dev

    安装systemtap:
    postgres@lq-pc:~$ sudo apt-get install systemtap systemtap-sdt-dev
    检查stap:
    postgres@lq-pc:~$ stap --version

    下载源码(~/software):postgresql-9.3.4.tar.gz
    解压:
    postgres@lq-pc:~$ cd
    postgres@lq-pc:~$ mkdir project
    postgres@lq-pc:~$ cd project
    postgres@lq-pc:~/project$ tar zxvf ~/software/postgresql-9.3.4.tar.gz
    postgres@lq-pc:~/project$ mv postgresql-9.3.4 pgsql
    postgres@lq-pc:~/project$ cd pgsql

    配置:
    postgres@lq-pc:~/project/pgsql$ ./configure --prefix=$HOME/pgsql --with-pgport=5432 --with-perl --with-python --with-tcl --with-openssl --with-pam  --without-ldap --with-libxml  --with-libxslt  --enable-thread-safety  --with-wal-blocksize=16 --with-blocksize=16 --enable-dtrace --enable-depend --enable-cassert --enable-debug


    (3)导入代码
    在Eclipse主界面,点击File-Import,选择"C/C++"-"Existing Code as Makefile Project",Next,
    在弹出的"Import Existing Code"对话框中,设置
    Project Name:pgsql
    Existing Code Location:/home/postgres/project/pgsql
    Language:选择C,必须去掉"C++"复选框
    Toolchain for Indexer Settings:选择Linux GCC
    单击"Finash"按钮。

    4.开发与调试
    (1)新建Make Target
    在调试PostgreSQL之前,首先需要将其安装到某个目录中,在Eclipse中是通过建立一个Make Target实现的。
    在工程pgsql上单击右键,选择Make Targets-Create,在弹出的"Create Make Target"对话框中,输入:
    Target name:install
    单击OK。

    编译安装:
    在工程pgsql上单击右键,选择Make Targets-Build,选择install,单击Build。
    直到出现"PostgreSQL installation complete.",表示安装完成。

    此时,在$HOME/pgsql目录下,会生成bin、include、lib和share目录。

    此时可以关闭eclipse了。


    (2)尝试运行数据库
    回到命令行,设置当前用户的环境变量:
    postgres@lq-pc:~$ cd
    postgres@lq-pc:~$ vim ./.profile
    在末尾添加:

    # add PG env
    export PATH=$PATH:$HOME/pgsql/bin
    export PGDATA=/db/pgdata

    export PATH=$PATH:$HOME/pgsql/bin
    export PGDATA=/db/pgdata
    立即生效:postgres@lq-pc:~$ source ./.profile

    初始化数据库目录:
    postgres@lq-pc:~$ initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
    (密码名字全拼)

    初始化成功后,打开新的终端,执行source ./.profile,然后重新打开Eclipse,在pgsql上单击右键,Run as-Run Configurations,
    在弹出的Run Configration对话框中的左侧,双击C/C++ Application,会创建一个一个名称为pgsql Default的配置界面:
    Main选项卡:
    C/C++ Application:src/backend/postgres
    Project:pgsql
    切换到Arguments选项卡:
    Program arguments:-D /db/pgdata

    单击Apply,然后单击Run。
    直到出现信息
    "LOG:  database system was shut down at 2014-04-16 17:34:34 CST
    LOG:  autovacuum launcher started
    LOG:  database system is ready to accept connections"
    表示数据库已成功启动。

    查看postgres进程和相关后台进程:ps -ef | grep postgres

    此时,可以在命令行,测试一下:
    查看数据库:
    psql -l
    创建数据库:
    createdb DemoDB
    psql -l
    登录刚才创建的数据库(进行操作):
    psql DemoDB
    退出PostgreSQL:
    \q


    (3)调试数据库代码
    数据库运行成功后,一定要关闭已经开启的Postmaster进程才能进行调试,否则会提示"Postmaster已经存在"的错误。
    关闭已启动的数据库进程:
    点击Console面板右侧的红色Terminate关闭图标,即可关闭。
    查看postgres进程,确认是否关闭:ps -ef | grep postgres

    如果要调试Postgresql源码,要保证安装了gdb:sudo apt-get install gdb


    单击工程右键,Debug As-Local C/C++ Application,选择"postgres"作为调试程序,单击OK,即可进入调试模式。

    此时程序自动会在main函数处停下,所以要继续点击工具栏上的"Resume"按钮让主进程运行完,否则无法连接数据库。Debug运行完后会有和运行成功时一样的提示信息。

    打开一个终端,查看postgres进程:ps -ef | grep postgres

    debug模式的按钮简介:
    Resume(F8):重新开始执行debug,一直运行直到遇到breakpoint
    Suspend:暂挂
    Terminate:终止
    Disconnect:断开
    Step Into:跳入
    Step Over:跳出
    Step Return:执行完当前函数,然后return跳出该函数


    (4)服务进程(postgres的子进程)的调试
    使用psql登录:
    psql
    查看其进程号:select pg_backend_pid();
    注意:记住这个进程号,如2800。

    打开另一个终端,输入ps -ef | grep postgres
    发现此时,多了一个进程:
    postgres  2800  2776  0 15:42 ?        00:00:00 postgres: postgres postgres [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"在程序的进程列表中,选择进程号(2800)对应的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
    从ubuntu10.10开始,除非进程B是进程A的子进程,或者进程A为root运行,否则进程A不能调试进程B。这样一来增加了进程的安全。这个安全限制是默认的,但是可以通过修改配置文件来达到任意进程A可以调试进程B的目的。
    解决方法:
    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
    重启操作系统之后可以生效。

    修改之后,再次调试子进程,单击OK,可以看到已经将调试工具挂上了这个postgres进程。

    断点调试:
    在postgres工程中的postgres.c文件(这个是psql命令的入口地方)中,搜索一下simple,就会看到一个大的switch语句,在这行加个断点。
    回到命令行,输入一条SQL:
    select 1+2;
    回到Eclipse界面,程序停在了断点处,然后就可以在Eclipse中来追踪PostgreSQl的执行过程了。

  • 相关阅读:
    PHP 方法整合类 -- 1.根据概率产生随机数 --2.判断手机号归属地及运营商 --3.过滤emoji表情
    PHP 多图下载并打包压缩方法
    PHP 导出excel 精简版
    PHP获取首字母相关方法
    no input file specified 解决办法
    百度地图相关
    经纬度相关方法
    阿里云SSL证书部署至宝塔
    微信入口、生成菜单,公众号授权获取用户信息(unionid)
    超级好用超级简单的支付类库
  • 原文地址:https://www.cnblogs.com/liqiong/p/4267974.html
Copyright © 2020-2023  润新知