提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

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入门相关推荐

  1. postgresql源码学习(51)—— 提交日志CLOG 原理 用途 管理函数

    一. CLOG是什么 CLOG(commit log)记录事务的最终状态. 物理上,是$PGDATA/pg_xact目录下的一些文件 逻辑上,是一个数组,下标为事务id,值为事务最终状态 1. 事务最 ...

  2. PostgreSQL源码学习(1)--PG13代码结构

    PostgreSQL源码学习(1)–PG13代码结构 PostgreSQL代码结构 Bootstrap:用于支持Bootstrap运行模式,该模式主要用来创建初始的模板数据库. Main:主程序模块, ...

  3. postgresql源码学习(27)—— 事务日志⑦-日志落盘上层函数 XLogFlush

    一. 预备知识 1. XLOG什么时候需要落盘 事务commit之前 log buffer被覆盖之前 后台进程定期落盘 2. 两个核心结构体 这两个结构体定义代码在xlog.c,它们在日志落盘过程中非 ...

  4. postgresql源码学习(49)—— MVCC⑤-cmin与cmax 同事务内的可见性判断

    一. 难以理解的场景 postgresql源码学习(十九)-- MVCC④-可见性判断 HeapTupleSatisfiesMVCC函数_Hehuyi_In的博客-CSDN博客 在前篇的可见性判断中有 ...

  5. postgresql源码学习(一)—— 源码编译安装与gdb调试入门

    一. postgresql源码编译安装 因为只是用来调试的测试环境,把基本的软件装好和库建好就可以,一切从简. 1. 创建用户和目录 mkdir -p /data/postgres/base/ mkd ...

  6. postgresql源码学习(57)—— pg中的四种动态库加载方法

    一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...

  7. postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数

    一. table_relation_vacuum函数 1. 函数定义 前篇最后(https://blog.csdn.net/Hehuyi_In/article/details/128749517),我 ...

  8. postgresql源码学习(52)—— vacuum①-准备工作与主要流程

    关于vacuum的基础知识,参考,本篇从源码层继续学习 https://blog.csdn.net/Hehuyi_In/article/details/102992065 https://blog.c ...

  9. postgresql源码学习(九)—— 常规锁②-强弱锁与Fast Path

    一. 强锁与弱锁 根据兼容性表,彼此相容的3个锁(1-3级,AccessShareLock.RowShareLock.RowExclusiveLock)是弱锁,4级锁ShareUpdateExclus ...

最新文章

  1. Input type=“file“上传文件change事件只触发一次解决方案
  2. 【渝粤教育】 国家开放大学2020年春季 1108钢结构(本) 参考试题
  3. 收藏 | 那些机器学习必备知识
  4. 南京邮电大学java程序设计作业在线编程第二次作业
  5. spring3-mvc实例-信息转换
  6. 蓝桥杯国赛之阶乘位数
  7. 1.Excel绘制斜线表头
  8. 关于修复msvcp110.dll丢失的问题
  9. 冗余技术----线路冗余与生成树技术及其安全增强
  10. dfuse 新版 client-js 库发布
  11. 三维电子沙盘大数据互动触摸交互可视化地理信息系统
  12. 高一Python入门第三讲 石头剪刀布
  13. TaintDroid剖析之DVM变量级污点跟踪(下篇)
  14. 【面试】面试常问之堆栈的区别
  15. 推荐给初学者:如何学好C语言?
  16. Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)
  17. IC学习笔记——DRV8840
  18. 思岚科技受邀CES Asia 展示机器人定位导航领先技术
  19. 纯js写的手机版成语填空游戏
  20. 手Q体验不满意的地方之(3)——个人设置栏

热门文章

  1. c语言程序运行一次之后继续运行,怎样让电脑在合上后继续运行
  2. 安装gym 遇到的各种坑
  3. 绿地深蓝机器人_布局人工智能 绿地控股3亿元入股深兰科技
  4. buuoj Pwn writeup 186-190
  5. 共襄制造强国数字中国建设盛举|工业元宇宙协同发展组织成立,众享比特入选首批成员单位
  6. WIN10笔记本找不到摄像头?!
  7. 2022-4-16 基于单片机的PM2.5检测报警设计(传感器)
  8. java获取机器序列号_纯java获取CPU序列号,生成机器码
  9. 全民直播牵手阿里云,技术升级触发直播新体验
  10. 电路基础学习笔记6:实验验证戴维南定理