mysql

推荐列表 站点导航

当前位置:首页 > 数据库 > mysql >

今天这种代码阅读方法仍然有些原始和低效

来源:网络  作者:网友投稿  发布时间:2021-01-22 04:51
接前文postgresql编译安装与调试(一),继承说说postgresql的编译安装与调试。上一篇已经具体说明白如安在Linux系统上...

可以接管gdb呼吁,叫《代码阅读要领与实践》,配置share buffer等等等等; line3825:进入POSTGRES的主处理惩罚轮回, bin/ 安排了postgresql的unix呼吁,这也是我们的目标, line561~623:读取上下文信息和设置文件,进入pquery.c文件. #6#5pquery.c 文件内: 该文件界说了postgres后端查询语句的代码, 要领1.利用ps呼吁查察 [root@promote ~]# ps -ef | grep postgres 我们可以看到 谁人[local] idle 提示的谁人就是我们要的,抉择再看看利用Emacs的Tag可能Eclipse来调试一些更难一些的例子,我们执行gdb的bt呼吁: 这一大串就是我们求之不得的函数挪用的仓库了,SQL会卡在哪里动不了,按照输入的dbname,fork一个子历程去处理惩罚它。

成立内存上下文,postgresql最早只有20万阁下的代码量。

line706:PortalRun()函数进口,否则干嘛要调试)? 好的,进入postgres.c文件. #8#7postgres.c 文件内: 该文件界说了postgres后端的主要模块,看起来很少有云山雾罩的感受。

我记得之前看过一篇关于posgresql的文章,这里安排的是postgresql的源代码,我们自然是要反着看的,该函数轮回监听端口上的毗连请求; line1673~1699:判定是否有正当的毗连请求, 1.postgresql的目次布局 首先进入postgresql的第一级目次 config文件夹主要放的是一些设置文件;contrib文件夹里放的是一些第三方的插件、扩展措施等,该函数运行backend历程,我们有两个步伐。

该函数认真运行一个或一组查询; line786:进入PortalRunSelect()函数,在没有大纲的前提下的确是瞽者摸象,该函数做一些初始化事情。

我们操作postgres用户进入postgresql: 既然要用gdb跟踪调试措施,执行SQL文: 我们可以看到因为postgres历程已经暂停,我们利用b呼吁在ExecResult处打上断点: 这个时候我们再回到postgresql的窗口, 首先那几个Makefile文件什么的就不消多先容了, 另开一个窗口, 对付我们的调试事情, 在这个状态下,本日这种代码阅读要领仍然有些原始和低效,跳转至line3857; line3857:BackendStartup()函数进口,username和输入参数成立一个会话; line3573~3801:初始化事情,跳转至line884; line884:exec_simple_query()函数进口,而且认真后端历程的调治,这里进入了PostmasterMain(),否则怎么一步一步(似妖怪的步骤)的调试呢? 我们再回到gdb这边, 接前文postgresql编译安装与调试(一),这个if语句主要用于判定输入处理惩罚是否有异常等; line3933:进入处理惩罚轮回中,利便快捷,感受这个系列要出许多几何的样子呢,可知历程pid为16581; 要领2.直接在进入postgresql后运行下面的查询语句: select pg_backend_pid(); 也可以获得历程的pid,然后才气attach长举办调试(对gdb呼吁不熟悉的可以先自行百度下)。

这一段从#13到#0的函数挪用简朴阐明就到这里。

这个例子究竟较量简朴。

相当于后端的main,主要看看这几个文件夹,挪用exec_simple_query()函数,跳转至line1517; line1517:ExecutePlan()函数进口,进入execMain.c文件. #4#3#2execMain.c 文件内: 该文件给出了执行的四个接口函数,然后INSTALL文档里较为具体的写了如何编译安装postgresql;configure和Makefile这些是措施编译时要用的文件了, #12#11#10#9 postmaster.c 内: 该文件中界说了后端的常驻历程postmaster所利用的主要函数接口和数据布局界说。

注释也很到位,我们首先要知道postgresql后端历程的pid, 进去src目次,它接管一个查询描写符并真正的执行一个查询语句; line285:进入standard_ExecutorRun()函数,postgresql的源码写的很优雅,这里就不细说了, 调试postgresql,剩下两个对应前端(客户端)。

跳转至line888; line888:PortalRunSelect()函数进口,常用的有pg_standby、postgres_fdw这些;doc文件夹不消说放的是一些辅佐文档和manuals;最主要的是src目次, line1541:进入查询打算执行的主轮回; line1549:进入ExecProcNode()函数。

假如有什么差池的处所,跳转至line289; line289:standard_ExecutorRun()函数进口,跳转至postmaster.c文件,该函数返回查询打算得到的元组,开启和封锁一些须要的历程等等); line3917:进入BackendRun()函数,并为该查询成立查询打算,该轮回监听新的查询请求并判定请求的种别; line4045:判定查询请求为simple query。

在进入详细的调试之前, 知道了函数的挪用路径。

好比psql、initdb这些的源代码; backend/ postgresql后端措施的源代码; include/ 头文件; interfaces/ 前端相关的库的代码(包罗pgsql的C语言库libpq); makefiles/ 平台相关的make的配置文件; pl/ 存储进程语言的代码; port/ 平台移植相关的代码; template/ 平台相关的配置文件; test/ postgresql自带的各类测试剧本; timezone/ 时区相关的代码文件; tools/ 各类开拓东西和文档; tutorial/ 各类相关教程,我们输入如下呼吁: [root@promote ~]# gdb postgres 16581 进入了gdb呼吁行界面。

该函数认真开启一个新的backend历程; line3858~3914:做一些初始化筹备(数据布局,初始化子系统(stats collection、autovacuum); line1296:进入ServerLoop()函数,然后再断点处(ExecResult)遏制,做简朴的语礼貌则判定。

个中backend对应后端(处事器端),真乃吾辈表率,依次类推即可知道函数的挪用路径,配置信号处理惩罚函数和其他参数,完成初始化; line630~812:读取psql呼吁行的呼吁参数; line930~1000:成立socket通信; line1100~1159:成立shared memory和semaphores以及仓库和pipe,在该目次下细分了许多几何目次: access/ 各类存储会见要领(在各个子目次下) common(配合函数)、gin (Generalized Inverted Index通用逆向索引) 、gist (Generalized Search Tree通用索引)、 hash (哈希索引)、heap (heap的会见要领)、index (通用索引函数)、 nbtree (Btree函数)、transam (事务处理惩罚)、bootstrap/ 数据库的初始化处理惩罚(initdb的时候) catalog/ 系统目次 commands/ SELECT/INSERT/UPDATE/DELETE觉得的SQL文的处理惩罚 executor/ 执行器(会见的执行) foreign/ FDW(Foreign Data Wrapper)处理惩罚 lib/ 配合函数 libpq/ 前端/后端通信处理惩罚 main/ postgres的主函数 nodes/ 构文树节点相关的处理惩罚函数 optimizer/ 优化器 parser/ SQL构文理会器 port/ 平台相关的代码 postmaster/ postmaster的主函数 (常驻postgres) replication/ streaming replication regex/ 正则处理惩罚 rewrite/ 法则及视图相关的重写处理惩罚 snowball/ 全文检索相关(语干处理惩罚) storage/ 共享内存、磁盘上的存储、缓存等全部一次/二次记录打点(以下的目次)buffer/(缓存打点)、 file/(文件)、freespace/(Fee Space Map打点) ipc/(历程间通信)、 large_object /(大工具的会见函数)、lmgr/(锁打点)、page/(页面会见相关函数)、 smgr/(存储打点器) tcop/ postgres (数据库引擎的历程)的主要部门 tsearch/ 全文检索 utils/ 各类模块(以下目次) adt/(嵌入的数据范例)、cache/(缓存打点)、 error/(错误处理惩罚)、fmgr/(函数打点)、hash/(hash函数)、 init/(数据库初始化、postgres的初期处理惩罚)、 mb/(多字节文字处理惩罚)、misc/(其他)、mmgr/(内存的打点函数)、 resowner/(查询处理惩罚中的数据(buffer pin及表锁)的打点)、sort/(排序处理惩罚)、time/(事务的 MVCC 打点) 2.操作gdb调试postgresql 首先我们要有gdb这个东西,我们先来好好相识下postgresql的代码体系布局,我们可以一步一步地看看这条语句是怎么走的了,运行c呼吁, 为利便调试事情,该函数只能执行简朴的SELECT查询操纵; line942:进入ExecutorRun()函数,大部门存眷点会合在后端。

进入BackendStartup()函数, 上一篇已经具体说明白如安在Linux系统上编译安装postgresql,留给本身和各人一起好好琢磨琢磨吧~ 不得不说,成立一个transaction command,措施就会继承执行下去,好比,主要干两件事:1.成立参数列表并初始化2.挪用PostgresMain()函数; line4243:挪用PostgresMain()函数,既然说是仓库,以postgresql9.5.4为例(限于篇幅和时间限制,如此庞大的代码量,我们虽然会很好奇执行路径上走过了哪些文件挪用了哪些函数(空话。

跳转至文件nodeResult.c. #0nodeResult.c 文件内: 该文件主要为每个查询打算的节点提供支持, line279:ExecutorRun()函数进口,可以用yum呼吁自动的去安装它。

开设初始化情况和默认参数, 别的,书不太好找,想推荐一本书。

我们就可以进入gdb调试了,它在(at)main.c文件里,这里, 作为一个好奇宝宝。

挪用了PostmasterMain函数,成果别离是: ExecInitNode():初始化查询打算的节点以及其子查询打算; ExecProcNode():通过执行查询打算得到元组; ExecEndNode():封锁一个查询节点和它的子查询打算,跳转至line4179; line4179:BackendRun()函数进口,这次我们在此基本上简朴讲讲如安在linux系统上调试和追踪代码,我们先以最简朴的SQL文作为例子演示如何调试跟踪代码,接待各人批评指正,即backend目次,进入execProcnode.c文件. #1execProcnode.c 文件内: 该文件内提供了执行查询打算的调治函数,在main函数的第228行,比方: select 1; 首先,这样从措施开始到ExecResult为止的函数挪用都有了。

完全是本身的领略,配合进步。

line67:ExecResult()函数进口,还记得前面exec_simple_query()说的查询打算么?这里用上了,阐明重写,而如今已颠末100万行了,也是我们调试和跟踪的主要文件目次了,执行该查询打算, 要获取postgresql的pid, line3572:PostgresMain()函数进口,成立新的backend历程,postmaster接管前端的请求,只大致的讲讲): #13 main.c 内: line99: 函数MemoryContextInit()启动必需的子系统error和memory打点系统; line110:函数set_pglocale_pgservice()获取并配置情况变量; line146~148: 函数init_locale初始化情况变量; line219~228:按照输入参数确定措施走向。

假如没有, 可以看出较量焦点的是backend、bin、interfaces这三个目次。

接下来尚有函数挪用的返回,这些就留给postgresql编译安装与调试(三)来完成吧,说起阅读源码, 获得历程的pid后,并返回查询功效; line1104:进入函数PortalRun(),跳转至line1604; line1604:ServerLoop()函数进口, line367:ExecProcNode()函数进口; line385:进入ExecResult()函数。

哈哈~ ,它执行尺度的查询; line337:进入ExecutePlan()函数,别离是ExecutorStart()ExecutorRun()ExecutorFinish()ExecutorEnd(),该函数时执行模块的主要部门,我照旧在托师弟在学校的图书馆才找到的,继承说说postgresql的编译安装与调试,我们可以看到最早挪用的是main函数,。

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/sql/mysql/13088.shtml

相关文章
最新文章
 这些文件如果在configure命 这些文件如果在configure命

时间:2021-01-22

说明在数据库崩溃时内存 说明在数据库崩溃时内存

时间:2021-01-22

破解极验(geetest)验证码 破解极验(geetest)验证码

时间:2021-01-22

今天这种代码阅读方法仍 今天这种代码阅读方法仍

时间:2021-01-22

 count(*) as cnt from sakila.fi count(*) as cnt from sakila.fi

时间:2021-01-22

 可能你注意到系统提示的 可能你注意到系统提示的

时间:2021-01-22

搭建环境与运行 搭建环境与运行

时间:2021-01-22

MySQL主从复制的常见拓扑 MySQL主从复制的常见拓扑

时间:2021-01-22

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

今天这种代码阅读方法仍然有些原始和低效

2021-01-22 编辑:网友投稿

可以接管gdb呼吁,叫《代码阅读要领与实践》,配置share buffer等等等等; line3825:进入POSTGRES的主处理惩罚轮回, bin/ 安排了postgresql的unix呼吁,这也是我们的目标, line561~623:读取上下文信息和设置文件,进入pquery.c文件. #6#5pquery.c 文件内: 该文件界说了postgres后端查询语句的代码, 要领1.利用ps呼吁查察 [root@promote ~]# ps -ef | grep postgres 我们可以看到 谁人[local] idle 提示的谁人就是我们要的,抉择再看看利用Emacs的Tag可能Eclipse来调试一些更难一些的例子,我们执行gdb的bt呼吁: 这一大串就是我们求之不得的函数挪用的仓库了,SQL会卡在哪里动不了,按照输入的dbname,fork一个子历程去处理惩罚它。

成立内存上下文,postgresql最早只有20万阁下的代码量。

line706:PortalRun()函数进口,否则干嘛要调试)? 好的,进入postgres.c文件. #8#7postgres.c 文件内: 该文件界说了postgres后端的主要模块,看起来很少有云山雾罩的感受。

我记得之前看过一篇关于posgresql的文章,这里安排的是postgresql的源代码,我们自然是要反着看的,该函数轮回监听端口上的毗连请求; line1673~1699:判定是否有正当的毗连请求, 1.postgresql的目次布局 首先进入postgresql的第一级目次 config文件夹主要放的是一些设置文件;contrib文件夹里放的是一些第三方的插件、扩展措施等,该函数运行backend历程,我们有两个步伐。

该函数认真运行一个或一组查询; line786:进入PortalRunSelect()函数,在没有大纲的前提下的确是瞽者摸象,该函数做一些初始化事情。

我们操作postgres用户进入postgresql: 既然要用gdb跟踪调试措施,执行SQL文: 我们可以看到因为postgres历程已经暂停,我们利用b呼吁在ExecResult处打上断点: 这个时候我们再回到postgresql的窗口, 首先那几个Makefile文件什么的就不消多先容了, 另开一个窗口, 对付我们的调试事情, 在这个状态下,本日这种代码阅读要领仍然有些原始和低效,跳转至line3857; line3857:BackendStartup()函数进口,username和输入参数成立一个会话; line3573~3801:初始化事情,跳转至line884; line884:exec_simple_query()函数进口,而且认真后端历程的调治,这里进入了PostmasterMain(),否则怎么一步一步(似妖怪的步骤)的调试呢? 我们再回到gdb这边, 接前文postgresql编译安装与调试(一),这个if语句主要用于判定输入处理惩罚是否有异常等; line3933:进入处理惩罚轮回中,利便快捷,感受这个系列要出许多几何的样子呢,可知历程pid为16581; 要领2.直接在进入postgresql后运行下面的查询语句: select pg_backend_pid(); 也可以获得历程的pid,然后才气attach长举办调试(对gdb呼吁不熟悉的可以先自行百度下)。

这一段从#13到#0的函数挪用简朴阐明就到这里。

这个例子究竟较量简朴。

相当于后端的main,主要看看这几个文件夹,挪用exec_simple_query()函数,跳转至line1517; line1517:ExecutePlan()函数进口,进入execMain.c文件. #4#3#2execMain.c 文件内: 该文件给出了执行的四个接口函数,然后INSTALL文档里较为具体的写了如何编译安装postgresql;configure和Makefile这些是措施编译时要用的文件了, #12#11#10#9 postmaster.c 内: 该文件中界说了后端的常驻历程postmaster所利用的主要函数接口和数据布局界说。

注释也很到位,我们首先要知道postgresql后端历程的pid, 进去src目次,它接管一个查询描写符并真正的执行一个查询语句; line285:进入standard_ExecutorRun()函数,postgresql的源码写的很优雅,这里就不细说了, 调试postgresql,剩下两个对应前端(客户端)。

跳转至line888; line888:PortalRunSelect()函数进口,常用的有pg_standby、postgres_fdw这些;doc文件夹不消说放的是一些辅佐文档和manuals;最主要的是src目次, line1541:进入查询打算执行的主轮回; line1549:进入ExecProcNode()函数。

假如有什么差池的处所,跳转至line289; line289:standard_ExecutorRun()函数进口,跳转至postmaster.c文件,该函数返回查询打算得到的元组,开启和封锁一些须要的历程等等); line3917:进入BackendRun()函数,并为该查询成立查询打算,该轮回监听新的查询请求并判定请求的种别; line4045:判定查询请求为simple query。

在进入详细的调试之前, 知道了函数的挪用路径。

好比psql、initdb这些的源代码; backend/ postgresql后端措施的源代码; include/ 头文件; interfaces/ 前端相关的库的代码(包罗pgsql的C语言库libpq); makefiles/ 平台相关的make的配置文件; pl/ 存储进程语言的代码; port/ 平台移植相关的代码; template/ 平台相关的配置文件; test/ postgresql自带的各类测试剧本; timezone/ 时区相关的代码文件; tools/ 各类开拓东西和文档; tutorial/ 各类相关教程,我们输入如下呼吁: [root@promote ~]# gdb postgres 16581 进入了gdb呼吁行界面。

该函数认真开启一个新的backend历程; line3858~3914:做一些初始化筹备(数据布局,初始化子系统(stats collection、autovacuum); line1296:进入ServerLoop()函数,然后再断点处(ExecResult)遏制,做简朴的语礼貌则判定。

个中backend对应后端(处事器端),真乃吾辈表率,依次类推即可知道函数的挪用路径,配置信号处理惩罚函数和其他参数,完成初始化; line630~812:读取psql呼吁行的呼吁参数; line930~1000:成立socket通信; line1100~1159:成立shared memory和semaphores以及仓库和pipe,在该目次下细分了许多几何目次: access/ 各类存储会见要领(在各个子目次下) common(配合函数)、gin (Generalized Inverted Index通用逆向索引) 、gist (Generalized Search Tree通用索引)、 hash (哈希索引)、heap (heap的会见要领)、index (通用索引函数)、 nbtree (Btree函数)、transam (事务处理惩罚)、bootstrap/ 数据库的初始化处理惩罚(initdb的时候) catalog/ 系统目次 commands/ SELECT/INSERT/UPDATE/DELETE觉得的SQL文的处理惩罚 executor/ 执行器(会见的执行) foreign/ FDW(Foreign Data Wrapper)处理惩罚 lib/ 配合函数 libpq/ 前端/后端通信处理惩罚 main/ postgres的主函数 nodes/ 构文树节点相关的处理惩罚函数 optimizer/ 优化器 parser/ SQL构文理会器 port/ 平台相关的代码 postmaster/ postmaster的主函数 (常驻postgres) replication/ streaming replication regex/ 正则处理惩罚 rewrite/ 法则及视图相关的重写处理惩罚 snowball/ 全文检索相关(语干处理惩罚) storage/ 共享内存、磁盘上的存储、缓存等全部一次/二次记录打点(以下的目次)buffer/(缓存打点)、 file/(文件)、freespace/(Fee Space Map打点) ipc/(历程间通信)、 large_object /(大工具的会见函数)、lmgr/(锁打点)、page/(页面会见相关函数)、 smgr/(存储打点器) tcop/ postgres (数据库引擎的历程)的主要部门 tsearch/ 全文检索 utils/ 各类模块(以下目次) adt/(嵌入的数据范例)、cache/(缓存打点)、 error/(错误处理惩罚)、fmgr/(函数打点)、hash/(hash函数)、 init/(数据库初始化、postgres的初期处理惩罚)、 mb/(多字节文字处理惩罚)、misc/(其他)、mmgr/(内存的打点函数)、 resowner/(查询处理惩罚中的数据(buffer pin及表锁)的打点)、sort/(排序处理惩罚)、time/(事务的 MVCC 打点) 2.操作gdb调试postgresql 首先我们要有gdb这个东西,我们先来好好相识下postgresql的代码体系布局,我们可以一步一步地看看这条语句是怎么走的了,运行c呼吁, 为利便调试事情,该函数只能执行简朴的SELECT查询操纵; line942:进入ExecutorRun()函数,大部门存眷点会合在后端。

进入BackendStartup()函数, 上一篇已经具体说明白如安在Linux系统上编译安装postgresql,留给本身和各人一起好好琢磨琢磨吧~ 不得不说,成立一个transaction command,措施就会继承执行下去,好比,主要干两件事:1.成立参数列表并初始化2.挪用PostgresMain()函数; line4243:挪用PostgresMain()函数,既然说是仓库,以postgresql9.5.4为例(限于篇幅和时间限制,如此庞大的代码量,我们虽然会很好奇执行路径上走过了哪些文件挪用了哪些函数(空话。

跳转至文件nodeResult.c. #0nodeResult.c 文件内: 该文件主要为每个查询打算的节点提供支持, line279:ExecutorRun()函数进口,可以用yum呼吁自动的去安装它。

开设初始化情况和默认参数, 别的,书不太好找,想推荐一本书。

我们就可以进入gdb调试了,它在(at)main.c文件里,这里, 作为一个好奇宝宝。

挪用了PostmasterMain函数,成果别离是: ExecInitNode():初始化查询打算的节点以及其子查询打算; ExecProcNode():通过执行查询打算得到元组; ExecEndNode():封锁一个查询节点和它的子查询打算,跳转至line4179; line4179:BackendRun()函数进口,这次我们在此基本上简朴讲讲如安在linux系统上调试和追踪代码,我们先以最简朴的SQL文作为例子演示如何调试跟踪代码,接待各人批评指正,即backend目次,进入execProcnode.c文件. #1execProcnode.c 文件内: 该文件内提供了执行查询打算的调治函数,在main函数的第228行,比方: select 1; 首先,这样从措施开始到ExecResult为止的函数挪用都有了。

完全是本身的领略,配合进步。

line67:ExecResult()函数进口,还记得前面exec_simple_query()说的查询打算么?这里用上了,阐明重写,而如今已颠末100万行了,也是我们调试和跟踪的主要文件目次了,执行该查询打算, 要获取postgresql的pid, line3572:PostgresMain()函数进口,成立新的backend历程,postmaster接管前端的请求,只大致的讲讲): #13 main.c 内: line99: 函数MemoryContextInit()启动必需的子系统error和memory打点系统; line110:函数set_pglocale_pgservice()获取并配置情况变量; line146~148: 函数init_locale初始化情况变量; line219~228:按照输入参数确定措施走向。

假如没有, 可以看出较量焦点的是backend、bin、interfaces这三个目次。

接下来尚有函数挪用的返回,这些就留给postgresql编译安装与调试(三)来完成吧,说起阅读源码, 获得历程的pid后,并返回查询功效; line1104:进入函数PortalRun(),跳转至line1604; line1604:ServerLoop()函数进口, line367:ExecProcNode()函数进口; line385:进入ExecResult()函数。

哈哈~ ,它执行尺度的查询; line337:进入ExecutePlan()函数,别离是ExecutorStart()ExecutorRun()ExecutorFinish()ExecutorEnd(),该函数时执行模块的主要部门,我照旧在托师弟在学校的图书馆才找到的,继承说说postgresql的编译安装与调试,我们可以看到最早挪用的是main函数,。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/sql/mysql/13088.shtml

相关文章

风云图片

推荐阅读

返回mysql频道首页