postgresql源码阅读快速上手
前一篇(win10 源码编译安装postgresql数据库)介绍了windows下pg源码编译安装方法,那么装好之后从哪开始阅读学习pg源码?本文将介绍一种快速上手方法。
在进行源码编译时,务必编译成调式版(即执行perl build.pl DEBUG),便于调试学习。然后安装,运行,通过psql连接数据库,当然也可以通过pgAmin客户端连接,这里只介绍psql, 连接成功如下图:
对于一个有源码未知程序,如何快速掌握理解代码呢?当然是看运行堆栈,调试跟踪运行流程,掌握内部逻辑,理解各个函数功能。那么对于上百万行代码的pg源码,又从何处快速切入呢?请继续向下看。
在上面的psql连接窗口中执行 select pg_backend_pid(); 查询到当前服务pg后台进程,如我的是3956
通过vs2013打开pg代码工程:进入编译后的postgresql代码最上层目录,找到pgsql.sln 双击打开或先开vs2013在vs2013中,打开成功后会看到如下图:
依次点击最上面菜单栏中“调试”->“附加到进程”,在打开的窗口进找到上面查到的进程ID 3596 附加到当前工程(小技巧:按p可以快速定位到p开头的所有进程,找到ID为上面查到的那个)。附加成功后Visual Stdio 编译器左上角会显示“ pgsql(正在运行)”,如下图所示:
此时说明附加进程成功,那么一个可调试的pg环境就运行起来了,接下来就看怎么切入了。
可能大家会好奇,现在的pg是处于一种什么状态呢?结合前面的psql客户端来看,显然是正在等我们sql语句指令状态,在代码中又是怎么描述的呢?点击菜单栏中“调试”->“全部中断”(或者快捷键 Ctrl+Alt+Break),中断当前程序,如下图:
pg的代码风格很好,函数名差不多都能望文生义,一个个堆栈看下来基本能看出就是在等网络消息的状态,最终就停在WaitForMultipleObjects这个函数这了。当然如果在pg某个语句运行中也能通过“调试”->“全部中断”方式停下来,查看堆栈是否正常,如果语句运行太快了可以把数据量搞大点,这样就有时间做中断。
上面说的是运行中中断,实际使用中这样的操作场景可能比较少,更多的往往是出错情况下,想深究错误原因需要调试下。比方说执行某个语句,没有得出想要的结果,报错了,给出的错误信息不满意,或者说就是要看下执行流程,需要研究下代码,如何下手?下断点!当然,要在合适的地方下断点。pg内核报错接口已经封装好,只要在报错函数那下断点,所有错误都能断到,断到之后再看代码执行流程就很容易了,错误入口函数有这两个
errmsg(const char *fmt,...)
elog_finish(int elevel, const char *fmt,...)
找到这两个两个函数分别下断点,就能断到所有的内核报错信息,下面举个简单例子:
select *from txx; --txx表不存在,会报错,我们看堆栈
如图,在errmsg处被断到了,这里的堆栈我简单解释下,不做深入,以后再逐步展开,有兴趣者可以自己看代码,或找相关书籍深入研究。
main,相信每个写过代码的人都了解。
SubPostmasterMain,pg是一个多进程结构的数据库,这里会产生子进程。
BackendRun ,后台运行设置一些参数信息
PostgresMain,数据库主函数,从某种意义上说这是数据库的开始运行的地方
exec_simple_query ,执行一个Q报文协议语句
pg_analyze_and_rewrite,查询分析和重写
parse_analyze,语义分析
transformTopLevelStmt,解析树转查询树
transformStmt,同上,分类开始转
transformSelectStmt,转换一个select解析树(上一步已经分类到select类型语句)
transformFromClause,处理select中的from子句
transformFromClauseItem,处理from子句中每个项,from子句可以有多个项,如from t1,t2,t3多个表
transformTableEntry,转换具体表,如t1
addRangeTableEntry,同上
parserOpenTable,打开表,打开时发现表找不到,报错
errmsg,报错
这里是一个简单的报错用例,实际上还可能会有查询优化,查询执行等相关执行过程,暂不深入,本文只是告诉大家如何最简单快速的上手pg代码。
对于errmsg和elog_finish这两个报错接口的区别,大家可能有些疑问,我稍微介绍下。在代码中,errmsg被包成了ereport函数使用,elog_finish被包成了elog函数使用,对于ERROR级别的错误,ereport报的错是正常的错误,而elog报的错则是不正常的的错误。那么正常的错误,不正常的错误是什么意思?就拿上面的例子来说,我查一个表,这个表不存在,这就是正常的错误,但是如果一个值,按照设计只可能有三种值,比方说switch case1 case2 case3分别对应处理了,然后为了程序健壮性我们对其它所情况都报错,就应该用elog报,因为这是正常情况下不应该出现的错误,很可能是一个未初始化的值引发的。举个通俗点的例子,打篮球时别人进攻我防守不小心打手了,这犯规了,这种犯规就是正常的错误(用ereport),但是别人投球时我突然把篮筐扯掉不让人进,这肯定也犯规了,但这是非正常犯规,规则中没办法定义但的确又犯规(用elog)。
OK,本篇就这到,以后再出写一篇专门介绍postgresql在windows下调试的文章,希望能对大家有所帮助。
postgresql源码阅读快速上手相关推荐
- STM32F4 CAN总线通信资料参考,提供源码参考快速上手CAN总线通信
STM32F4 CAN总线通信资料参考,提供源码参考快速上手CAN总线通信,提供CAN1.CAN2通信这样便于在F4的一个板子学习 编号:489659239564198酱料的卡卡
- MTK android系统源码修改快速上手
1.拷贝代码仓库 从git@192.168.1.3:a89.git 到work目录下: cbk@YCS:~/work$ ll cbk@YCS:~/work$ rm -rf a89/ cbk@YCS:~ ...
- MyBatis 源码阅读 -- 核心操作篇
核心操作包是 MyBatis 进行数据库查询和对象关系映射等工作的包.该包中的类能完成参数解析.数据库查询.结果映射等主要功能.在主要功能的执行过程中还会涉及缓存.懒加载.鉴别器处理.主键自增.插件支 ...
- PostgreSQL源码分析
PostgreSQL源码结构 PostgreSQL的使用形态 PostgreSQL采用C/S(客户机/服务器)模式结构.应用层通过INET或者Unix Socket利用既定的协议与数据库服务器进行通信 ...
- Mycat源码篇 : 起步,Mycat源码阅读调试环境搭建
在研究mycat源码之前必须先把环境搭建好.这篇文章的目标就是搭建mycat源码调试环境.环境主要包括: git jdk maven eclipse mysql 这里假设你知道上面的知识点.我们搭建的 ...
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...
- php微框架 flight源码阅读
Flight(https://github.com/mikecao/fl... 是一个可扩展的PHP微框架,快速.简单,能够快速轻松地构建RESTful web应用程序,在github上有2k sta ...
- Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
接上一篇 dubbo-server 之后,再来看一下 dubbo-client 是如何工作的. dubbo提供者服务示例, 其结构是这样的! dubbo://192.168.11.6:20880/co ...
- Alibaba Druid 源码阅读(一) 数据库连接池初步
Alibaba Druid 源码阅读(一) 数据库连接池初步 简介 本文将初步探索数据库连接池的应用场景,为后面的源码分析做些准备 数据库连接池的应用场景 在没有连接池之前,在使用中,需要访问数据库时 ...
最新文章
- 网络拓扑系列 - 网络拓扑的“管理”元素
- 基于TPF111芯片的交流信号幅值检测
- 如何预防食品被新冠病毒污染?国家卫健委权威解答来了
- ACL 2020 | 基于机器阅读理解框架的命名实体识别方法
- 不少人暗搓搓的准备春招了,我有一些好东东和招聘信息给你
- html字居右垂直设置,css文字水平垂直居中怎么设置?
- PHP7.2的安装与配置(win7)
- 1.5编程基础之循环控制 21 角谷猜想
- IDEA社区版找不到tomcat
- 计算机机房维护保养计划表,机房日常维护保养计划
- 适配器模式之桥梁模式
- ie11rtm版升级到最新_解决将Office 2010 Beta升级到RTM(最终版)的问题
- Scala HandBook
- ibm tivoli_调优IBM DB2以获得最佳的IBM Tivoli Security Operations Manager性能
- 小程序开发需要什么步骤?步骤教程分享
- 高版本Android真机逆向测试环境搭建
- haribote bootpack.c 主任务程序代码阅读注释
- 1823. 找出游戏的获胜者
- 京东数科java咋样_校招|京东数科 Java 实习 一面
- Oracle Primavera Unifier Version 22.10 新特征
热门文章
- java能取到微秒吗,JAVA中如何获取毫秒和微秒数
- 百度2016年软件测试开发工程师面经
- 企业财务制度二--(三)所有者权益类科目 3131 本年利润(转载)
- OBS完美直播弹幕效果主播教程
- STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结
- 计算机在土地资源管理的应用,地理信息系统在土地资源管理中的运用
- 指针基础*p ;**pp
- 古训【增广贤文】——值得保存细读
- 计算机网络开班仪式学生代表发言稿,开班仪式学员代表发言稿
- Matplotlib数据可视化从入门到进阶