postgresql源码学习(一)—— 源码编译安装与gdb调试入门

 一、 postgresql源码编译安装

因为只是用来调试的测试环境,把基本的软件装好和库建好就可以,一切从简。

1. 创建用户和目录

mkdir -p /data/postgres/base/
mkdir -p /data/postgres/etc
mkdir -p /data/postgres/home/postgres
mkdir -p /data/postgres/tools

mkdir -p /data/postgres/pg5432/data

groupadd -g 502 dba
useradd -u 501 -g dba postgres -d /data/postgres/home/postgres

chown -R postgres:dba  /data/postgres

2. 配置limits.conf

vi /etc/security/limits.conf

postgres soft nproc 2047
postgres hard nproc 16384
postgres soft nofile 1024
postgres hard nofile 65536
* soft stack 10240
* hard stack 32768

3. 安装依赖包

yum -y install readline-devel
yum -y install python-devel
yum -y install perl-devel
yum -y install libuuid-devel
yum -y install gcc
yum -y install flex
yum -y install bison
yum -y install perl-ExtUtils-Embed
yum -y install zlib-devel   
yum -y install systemd-devel.i686
yum -y install systemd-devel.x86_64

4. postgresql安装

特别注意要加--enable-debug,--enable-dtrace也建议加上,后面可以结合Dtrace工具分析,不过安装过程会变慢不少。

tar -zxvf postgresql-14.0.tar.gz
cd postgresql-14.0/

./configure --prefix=/data/postgres/base/14.0/ --with-libedit-preferred --with-perl --with-python --with-uuid=e2fs --with-systemd --enable-debug --enable-dtrace
make world
make check
make install-world

编辑环境变量

su - postgres

vi .bash_profile

## Add for postgresql
export PGHOME=/data/postgres/base/14.0
export PGDATA=/data/postgres/pg5432/data
export PATH=$PGHOME/bin:$PATH:$HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib
export LANG=en_US.UTF-8

source .bash_profile

初始化并启动

initdb -D /data/postgres/pg5432/data -E UTF8 --locale=en_US.utf8
pg_ctl -D /data/postgres/pg5432/data -l logfile start

二、 gdb调试测试

1. psql连接,查看进程号

psql

select pg_backend_pid();
-- 返回 104728
create table t_insert(id int,c1 char(10),c2 char(10),c3 char(10));

2. gdb连接,设置断点

[root@DB02 ~]# gdb -p 104728
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-110.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
...
(gdb) b PageAddItemExtended
Breakpoint 1 at 0x78d040: file bufpage.c, line 199.

3. psql执行语句

insert into t_insert values(1,'11','12','13');
-- 会一直卡住,等待gdb调试

4. gdb调试

这里只是简单试试,后篇会有具体案例

(gdb) c
Continuing.

Breakpoint 1, PageAddItemExtended (page=page@entry=0x7fd5fc857f80 "", item=0x27d4e10 "\337\002", size=61, offsetNumber=offsetNumber@entry=0, 
    flags=flags@entry=2) at bufpage.c:199
199     {
(gdb) p *item
$1 = -33 '\337'
(gdb) bt
#0  PageAddItemExtended (page=page@entry=0x7fd5fc857f80 "", item=0x27d4e10 "\337\002", size=61, offsetNumber=offsetNumber@entry=0, 
    flags=flags@entry=2) at bufpage.c:199
#1  0x00000000004d54c0 in RelationPutHeapTuple (relation=relation@entry=0x7fd60e1aa4a8, buffer=buffer@entry=283, tuple=tuple@entry=0x27d4df8, 
    token=token@entry=false) at hio.c:62
#2  0x00000000004c695b in heap_insert (relation=relation@entry=0x7fd60e1aa4a8, tup=tup@entry=0x27d4df8, cid=cid@entry=0, 
    options=options@entry=0, bistate=bistate@entry=0x0) at heapam.c:2109
#3  0x00000000004d23d8 in heapam_tuple_insert (relation=0x7fd60e1aa4a8, slot=0x27d4ce8, cid=0, options=0, bistate=0x0) at heapam_handler.c:252
#4  0x000000000065a56c in table_tuple_insert (bistate=0x0, options=0, cid=<optimized out>, slot=0x27d4ce8, rel=0x7fd60e1aa4a8)
    at ../../../src/include/access/tableam.h:1374
#5  ExecInsert (mtstate=mtstate@entry=0x27d3a38, resultRelInfo=resultRelInfo@entry=0x27d3c48, slot=0x27d4ce8, 
    planSlot=planSlot@entry=0x27d42e8, estate=estate@entry=0x27d37d8, canSetTag=<optimized out>) at nodeModifyTable.c:934
#6  0x000000000065b98b in ExecModifyTable (pstate=0x27d3a38) at nodeModifyTable.c:2561
#7  0x0000000000630462 in ExecProcNode (node=0x27d3a38) at ../../../src/include/executor/executor.h:257
#8  ExecutePlan (execute_once=<optimized out>, dest=0x27b1968, direction=<optimized out>, numberTuples=0, sendTuples=false, 
    operation=CMD_INSERT, use_parallel_mode=<optimized out>, planstate=0x27d3a38, estate=0x27d37d8) at execMain.c:1551
#9  standard_ExecutorRun (queryDesc=0x27e4858, direction=<optimized out>, count=0, execute_once=<optimized out>) at execMain.c:361
#10 0x0000000000797e0a in ProcessQuery (plan=<optimized out>, sourceText=0x26f00a8 "insert into t_insert values(1,'11','12','13');", 
    params=0x0, queryEnv=0x0, dest=0x27b1968, qc=0x7ffe95113e40) at pquery.c:160
#11 0x0000000000798824 in PortalRunMulti (portal=portal@entry=0x2753998, isTopLevel=isTopLevel@entry=true, 
    setHoldSnapshot=setHoldSnapshot@entry=false, dest=dest@entry=0x27b1968, altdest=altdest@entry=0x27b1968, qc=qc@entry=0x7ffe95113e40)
    at pquery.c:1266
#12 0x0000000000798b4d in PortalRun (portal=portal@entry=0x2753998, count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry=true, 
    run_once=run_once@entry=true, dest=dest@entry=0x27b1968, altdest=altdest@entry=0x27b1968, qc=qc@entry=0x7ffe95113e40) at pquery.c:786
#13 0x0000000000794ab6 in exec_simple_query (query_string=0x26f00a8 "insert into t_insert values(1,'11','12','13');") at postgres.c:1214
#14 0x0000000000795f23 in PostgresMain (argc=argc@entry=1, argv=argv@entry=0x7ffe951142f0, dbname=0x271b9a8 "postgres", 
    username=<optimized out>) at postgres.c:4486
#15 0x0000000000487b8a in BackendRun (port=<optimized out>, port=<optimized out>) at postmaster.c:4506
#16 BackendStartup (port=0x2713530) at postmaster.c:4228
#17 ServerLoop () at postmaster.c:1745
#18 0x0000000000717d4d in PostmasterMain (argc=argc@entry=3, argv=argv@entry=0x26eabd0) at postmaster.c:1417
#19 0x00000000004889c2 in main (argc=3, argv=0x26eabd0) at main.c:209
 

三、 gdb常用命令

一般调试时代码输出是这样的

有个非常好用的命令 Ctrl+x a 可以一边查看代码一边调试

参考

使用GDB分析PostgreSQL

程序调试  |  GDB常用命令备忘录 - 简书

GDB常用命令大全 GDB 命令详细解释_Rolei_kezhu的博客-CSDN博客_gdb命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值