利用 GDB 快速阅读 postgresql 的内核代码
近期将加入关系型数据库存储领域,很有幸加入到了一家以PG 为核心生态的数据库内核研发的领域,能够深入研究 这个世界上最为先进的开源关系型数据库的内核设计。
简介
简单看一下PG的36年的历史(可能也是PG 用C语言实现的原因,毕竟当时C++才刚刚开始,PG 6.0都出来了,C++ 98标准还没出来):
阶段1: 伯克利大学的 postgres 项目
- 1986年:PG 在 加州伯克利大学的 Michael Stonebraker 教授 领导下进行开发
- 1987年 完成了一个版本的demo,包含 数据模型 以及 规则的定义(角色,权限 等多租户形态) 和 关系型数据的存储 都已经支持了。
- 1988年 在 ACM-SIGMOD 顶会展示了这个关系型数据存储系统的设计。
- 1989年 发布了第一个版本
- 1990年 因为用户对 规则系统的需求,重新设计了 规则系统 并发布了第二个版本。
- 1991年 发布了第三个版本,支持了 多种存储管理器 ,优化执行器
- 1992年 postgres 项目已经拥有了超过 2000 个服务于科研的计算项目。
- 1993年,因为随着postgres 项目用户的极速增加,仅仅由一个大学教授以及他带领学生们来进行维护远远不够,源代码的维护消耗了太多的用于研究数据库的时间,所以postgres 项目终结于 4.2版本。
阶段2: Postgres95 阶段
- 1994年 Andrew Yu 和 Jolly Chen 向POSTGRES中增加了 SQL 语言的解释器,将 Postgres 命名为 Postgres95 进行开源。PG95 性能上相比于 前面的 PG 版本拥有 30-50%的性能提升。
阶段3: PostgreSQL 阶段
- 1996年 重新将 Postgres95 改名为 PostgreSQL ,版本号从 6.0开始。
现在的github 上的pg 将 95版本加入了进来
源码编译 及 运行
个人编译环境是 unbuntu20.04,该编译步骤在其他系统中都一样的,PG 版本是 REL_12_STABLE
。
依赖库安装:
sudo apt install build-essential libreadline-dev zlib1g-dev -y
获取源码:
wget https://ftp.postgresql.org/pub/source/v12.11/postgresql-12.11.tar.bz2
tar xvf postgresql-12.11.tar.bz2 && cd postgresql-12.11
编译
# 如果 gdb 调试的话编译需要开启 debug模式,否则看不到内部符号信息 1. ./configure --prefix=/home/zhg/pgsql --enable-debug 2. make world -j && make install-world 3. mkdir /home/zhg/pgsql/data # 创建pg的数据目录 4. export LD_LIBRARY_PATH=/home/zhg/pgsql/lib:$LD_LIBRARY_PATH #添加到.bashrc中,编译的binary运行时需要加载
初始化数据库
/home/zhg/pgsql/bin/initdb -D /home/zhg/pgsql/data
启动PG
/home/zhg/pgsql/bin/pg_ctl -D /home/zhg/pgsql/data -l logfile start
,logfile是postgres 的log文件
创建数据库
/home/zhg/pgsql/bin/createdb testdb
终端进入数据库
/home/zhg/pgsql/bin/psql testdb
GDB 调试
我们期望追踪 insert 语句 以及 select 语句 在整个PG 中的执行链路。
1.提前建好表
执行 psql testdb
之后 输入一个建表命令,建表的时候不带索引,后面写入的时候只会写入 heap 存储引擎,不会查索引了。
create table a(id int, c1 int, c2 int, c3 int);
2. 启动gdb 并设置 源代码目录
另外启动一个终端,能够确认知道前面安装 pg 时的源码目录:
gdb attach -p xxxiod
gdb attach到 postgres 的交互进程 id,这样和终端命令的执行才能阻塞式得执行, 方便我们在gdb端check 执行逻辑。
gdb 内部输入 dir /home/zhg/postgresql-12.11
pg 源代码目录。
gdb 内部输入 layout src
,能够看到整个源代码的调用链路了,后续的 调试也能够实时展示整个代码的链路(对于查看一些 inline 函数的调用逻辑的时候可能需要 layout next,通过查看汇编中的变量进行确认):
3. 开始调试
在 psql 所在的链接终端输入插入数据的命令,为建表时的4个字段分别插入10 条数据(插入逻辑是一样的, 方便我们能够反复快速调试)。
insert into a select generate_series(1,10), random()*100, random()*100, random()*100;
此时,因为我们的另一个终端的 gdb attach 到了 postgres 的交互,所以这个命令会阻塞,需要我们在 gdb 的终端主动进行执行。
在 gdb 所在终端,我们只需要反复执行以下几个命令,就好了:
n
单步执行s
step到函数内部p
打印各种变量 以及 指针变量内容
利用 GDB 快速阅读 postgresql 的内核代码相关推荐
- 如何利用ChatPDF快速阅读英文论文,帮你写文章
如何利用ChatPDF快速阅读英文论文,帮你写文章 英语渣狂喜-确实惊艳到我了! 使用平台:https://www.chatpdf.com/ 1.上传PDF 访问官网:https://www.chat ...
- 如何利用ChatPDF快速阅读英文论文,帮你写作业
英语渣狂喜-确实惊艳到我了! 大家好,我是老表 使用平台:https://www.chatpdf.com/ 1.上传PDF 访问官网:https://www.chatpdf.com/,界面很美,点击直 ...
- Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码
CSDN GitHub Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码 AderXCoding/system/tools/lxr 本作品采用知识共享署名-非商业性使用-相同方式共享 ...
- linux 内核编号含义_如何阅读linux内核代码?
阅读代码从来就是不可行的方法,有篇文章详细讲了这个事,很多人都觉得应该多读代码, 读好的代码,比如Donald Knuth. 但事实上, 只要简单让你描述一下最近读了什么代码,绝大多数人都说不上.文章 ...
- 钉钉一行代码_利用Python快速搭建钉钉和邮件数据推送系统
前面的文章我们写到了利用Python实现钉钉和邮件的数据推送,在数据处理这一块实现了对mysql和odps的数据获取和处理,可以满足常规业务大部分数据场景需求,在一家初创公司数据基础建设还不完善的时候 ...
- 如何快速阅读verilog代码?
如何快速阅读verilog代码? 在阅读verilog代码也是有一定技巧的,有效的方式能够提高阅读速度. 快速阅读分为以下几步 1.弄清楚模块作用:能够一句话描述 首先要知道模块是做什么的,有什么作用 ...
- 如何快速阅读java源码_如何进行快速阅读代码
每个程序员所写的代码都有自己的风格,而我们在参考别人的代码的时候,如何能更快速更好地读懂和自己编程风格的代码呢?下面小编为你整理如何快速阅读代码,希望能帮到你. 快速阅读代码方法 1.阅读源代码的说明 ...
- 最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...
要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统.这样你才能在修改linux内核代码之后,完成验证的过程. 本文教你完成下列过程: 1.下载linux并编译linux内核源码 ...
- linux 跨平台查询 lxr,利用LXR来生成Linux内核代码的交叉索引页面
LXR(the Linux Cross Reference),linux 下的交叉索引工具,主要用来看源代码,其生成后的页面和http://lxr.linux.no/这个站点差不多,只不过生成自己的L ...
最新文章
- 如何设置鼠标移开后css,如何设置鼠标离开时由hover设置的样式不变?
- 干货 | B端产品如何设计权限系统?
- gitblit.cmd运行自动关闭
- mysqldatadir 转移
- 【转】[教程] CSS入门3:如何插入CSS样式
- layui多文件上传讲解_Layui 多文件上传 SSH
- xcode6的项目中虚拟键盘无法弹出
- FTP链接ubuntu链接被拒绝
- PowerShell 使用当前日期创建文件夹
- android studio gjson,Android Studio插件GsonFormat
- 合并两个有序数组-python
- 线性代数————思维导图(上岸必备)(矩阵部分)
- 【pwnable.kr】Toddler‘s Bottle-[collision]
- dell 如何给raid分区_如何在 UEFI 配置的系统中访问 RAID 控制器设置
- 关于页眉的奇偶页不同设置和奇数页页眉展示每一章名称的设置方法
- XP盗版问题解决方案
- MT【30】椭圆的第二定义解题
- python plc fx5u_三菱PLC FX5U定位编程时的注意事项说明
- matlab set函数
- 计算机键盘时好时坏,机子的CTRL键时好时坏?
热门文章
- 计算机基础知识(基础入门小白专属)五
- 【C++】C++静态库和动态库的区别
- labview简易计算机实验报告,labview 实验报告.doc
- 主码,候选码,外码,全码,主属性,非主属性的区别
- linux kde 黑屏,在manjaro-kde上nvidia开机黑屏解决办法
- 讨论 | 博士延期毕业?如何避免?
- java设计模式之工厂模式(UML类图分析+代码详解)
- 58、【backtrader股票策略】两资产的配对交易策略(pairs trading strategy)
- 【Opencv】Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图)
- APACHE官网下载历史版本TOMCAT(以8.5.6版本为例)