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
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=, 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=) 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=, dest=0x27b1968, direction=, numberTuples=0, sendTuples=false, 
    operation=CMD_INSERT, use_parallel_mode=, planstate=0x27d3a38, estate=0x27d37d8) at execMain.c:1551
#9  standard_ExecutorRun (queryDesc=0x27e4858, direction=, count=0, execute_once=) at execMain.c:361
#10 0x0000000000797e0a in ProcessQuery (plan=, 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=) at postgres.c:4486
#15 0x0000000000487b8a in BackendRun (port=, port=) 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常用命令

postgresql源码学习(一)—— 源码编译安装与gdb调试入门_第1张图片

postgresql源码学习(一)—— 源码编译安装与gdb调试入门_第2张图片

postgresql源码学习(一)—— 源码编译安装与gdb调试入门_第3张图片

postgresql源码学习(一)—— 源码编译安装与gdb调试入门_第4张图片

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

postgresql源码学习(一)—— 源码编译安装与gdb调试入门_第5张图片

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

postgresql源码学习(一)—— 源码编译安装与gdb调试入门_第6张图片

参考

使用GDB分析PostgreSQL

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

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

你可能感兴趣的:(PostgreSQL,源码学习,postgresql,gdb,源码,调试)