PostgreSQL源码学习(一)编译安装与GDB入门
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
PostgreSQL源码学习(一)编译安装与GDB入门
- 前言
- 一、安装PostgreSQL
- 1.获取源码
- 2.配置
- 3.编译
- 3.安装
- 4.其余,设置启动pg
- 二、GDB使用测试
- 1. psql连接,查看进程号
- 2. gdb连接,设置断点
- 3. psql执行语句
- 4. gdb调试
- 5. gdb常用命令
- 参考
前言
在参照官方文档用源码安装PostgreSQL后,测试GDB时,发现缺少调试信息,产生了No symbol table is loaded. Use the “file” command.问题,后来重新安装的PostgreSQL。
一、安装PostgreSQL
1.获取源码
PostgreSQL 12.2 源代码可以从官方网站 https://www.postgresql.org/download/的下载区中获得。你将得到一个名为postgresql-12.2.tar.gz或postgresql-12.2.tar.bz2的文件。在你获取文件之后,解压缩它:
gunzip postgresql-12.2.tar.gz
tar xf postgresql-12.2.tar
2.配置
系统配置源代码树,我这里添加enable-debug是把所有程序和库以带有调试符号的方式编译,这样子GDB运行才ok,如果有其它需求建议查看官方文档——配置设置。
./configure --enable-debug
3.编译
要开始编译,键入:
make
显示的最后一行应该是:
All of PostgreSQL successfully made. Ready to install.
3.安装
要安装PostgreSQL,输入:
make install
4.其余,设置启动pg
按照顺序打就好:
adduser postgres
# 添加一个用户postgres(PostgreSQL的默认用户名和数据库)
# 这样设置没有密码,可以从root进,或者passwd。
mkdir /usr/local/pgsql/data
# 创建数据目录
chown postgres /usr/local/pgsql/data
# 赋予权限
su - postgres
# 切换用户,注意“-”,使用这个的时候会source ~/.bash_profile文件,使得postgres用户配置有效
# 我之前直接 从root用户,su postgres,PG打不开
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
# 初始化
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
# 启动+log
注:若启动时,端口占用报错,修改data目录下的postgresql.conf文件,找到port,将‘#’删掉,同时更换端口号
psql
# 进入PG,ok
二、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连接,设置断点
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
5. gdb常用命令
参考
postgresql源码学习(一)—— 源码编译安装与gdb调试入门
PostgreSQL 12.2 手册
仅供学习与交流,主要是个人学习总结,侵删。
本人初学者,如果有什么问题,感谢大家批评指正!
PostgreSQL源码学习(一)编译安装与GDB入门相关推荐
- postgresql源码学习(51)—— 提交日志CLOG 原理 用途 管理函数
一. CLOG是什么 CLOG(commit log)记录事务的最终状态. 物理上,是$PGDATA/pg_xact目录下的一些文件 逻辑上,是一个数组,下标为事务id,值为事务最终状态 1. 事务最 ...
- PostgreSQL源码学习(1)--PG13代码结构
PostgreSQL源码学习(1)–PG13代码结构 PostgreSQL代码结构 Bootstrap:用于支持Bootstrap运行模式,该模式主要用来创建初始的模板数据库. Main:主程序模块, ...
- postgresql源码学习(27)—— 事务日志⑦-日志落盘上层函数 XLogFlush
一. 预备知识 1. XLOG什么时候需要落盘 事务commit之前 log buffer被覆盖之前 后台进程定期落盘 2. 两个核心结构体 这两个结构体定义代码在xlog.c,它们在日志落盘过程中非 ...
- postgresql源码学习(49)—— MVCC⑤-cmin与cmax 同事务内的可见性判断
一. 难以理解的场景 postgresql源码学习(十九)-- MVCC④-可见性判断 HeapTupleSatisfiesMVCC函数_Hehuyi_In的博客-CSDN博客 在前篇的可见性判断中有 ...
- postgresql源码学习(一)—— 源码编译安装与gdb调试入门
一. postgresql源码编译安装 因为只是用来调试的测试环境,把基本的软件装好和库建好就可以,一切从简. 1. 创建用户和目录 mkdir -p /data/postgres/base/ mkd ...
- postgresql源码学习(57)—— pg中的四种动态库加载方法
一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...
- postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数
一. table_relation_vacuum函数 1. 函数定义 前篇最后(https://blog.csdn.net/Hehuyi_In/article/details/128749517),我 ...
- postgresql源码学习(52)—— vacuum①-准备工作与主要流程
关于vacuum的基础知识,参考,本篇从源码层继续学习 https://blog.csdn.net/Hehuyi_In/article/details/102992065 https://blog.c ...
- postgresql源码学习(九)—— 常规锁②-强弱锁与Fast Path
一. 强锁与弱锁 根据兼容性表,彼此相容的3个锁(1-3级,AccessShareLock.RowShareLock.RowExclusiveLock)是弱锁,4级锁ShareUpdateExclus ...
最新文章
- Input type=“file“上传文件change事件只触发一次解决方案
- 【渝粤教育】 国家开放大学2020年春季 1108钢结构(本) 参考试题
- 收藏 | 那些机器学习必备知识
- 南京邮电大学java程序设计作业在线编程第二次作业
- spring3-mvc实例-信息转换
- 蓝桥杯国赛之阶乘位数
- 1.Excel绘制斜线表头
- 关于修复msvcp110.dll丢失的问题
- 冗余技术----线路冗余与生成树技术及其安全增强
- dfuse 新版 client-js 库发布
- 三维电子沙盘大数据互动触摸交互可视化地理信息系统
- 高一Python入门第三讲 石头剪刀布
- TaintDroid剖析之DVM变量级污点跟踪(下篇)
- 【面试】面试常问之堆栈的区别
- 推荐给初学者:如何学好C语言?
- Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)
- IC学习笔记——DRV8840
- 思岚科技受邀CES Asia 展示机器人定位导航领先技术
- 纯js写的手机版成语填空游戏
- 手Q体验不满意的地方之(3)——个人设置栏