因为只是用来调试的测试环境,把基本的软件装好和库建好就可以,一切从简。
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
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
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
特别注意要加--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
psql
select pg_backend_pid();
-- 返回 104728
create table t_insert(id int,c1 char(10),c2 char(10),c3 char(10));
[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
This is free software: you are free to change and redistribute it.
...
(gdb) b PageAddItemExtended
Breakpoint 1 at 0x78d040: file bufpage.c, line 199.
insert into t_insert values(1,'11','12','13');
-- 会一直卡住,等待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=
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=
#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=
operation=CMD_INSERT, use_parallel_mode=
#9 standard_ExecutorRun (queryDesc=0x27e4858, direction=
#10 0x0000000000797e0a in ProcessQuery (plan=
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=
#15 0x0000000000487b8a in BackendRun (port=
#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
一般调试时代码输出是这样的
有个非常好用的命令 Ctrl+x a 可以一边查看代码一边调试
参考
使用GDB分析PostgreSQL
程序调试 | GDB常用命令备忘录 - 简书
GDB常用命令大全 GDB 命令详细解释_Rolei_kezhu的博客-CSDN博客_gdb命令