一、 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 可以一边查看代码一边调试
参考