
从零开始学习MySQL调试跟踪(1)
有时为了跟踪故障需要调试MySQL/GreatSQL源码,本文介绍如何在Linux下构建MySQL/GreatSQL源码调试环境。
在这之前,我也是一名小白,一起从零开始探索吧。
本文以CentOS 8.x环境下的GreatSQL 8.0.25-16版本为例。
1. 编译GreatSQL
查看系统环境:
首先,从https://gitee.com/GreatSQL/GreatSQL/releases/ 下载GreatSQL 8.0.25-16的源码包
- Source Code
PackagesSizegreatsql-8.0.25-16.tar.gz503M
接下来,参考文章 在Linux下源码编译安装GreatSQL 构建好编译环境。然后开始编译GreatSQL源码,编译参数中增加/修改debug相关选项,这样编译后得到的二进制文件才能支持调试模式,例如:
主要是增加两个参数 -DWITH_DEBUG=1
和 -DCMAKE_BUILD_TYPE=Debug
,注意不要有参数 -DCMAKE_BUILD_TYPE=RelWithDebInfo
。
编译完成后,即可得到包含debug功能的GreatSQL二进制文件,执行下面的命令检查:
可以看到,输出的结果中包含 debug
关键字,这就表示成功了。
2. 安装gdb
直接执行yum安装gdb即可:
gdb常用的调试相关指令有以下几个:
命令 | 缩写 | 备注 |
attach | 挂接/进入准备调试的进程pid | |
detach | 取消挂接进程(退出进程) | |
list | l | 显示多行源代码 |
break | b | 设置断点,程序运行到断点的位置会停下来 |
info | i | 描述程序的状态 |
run | r | 开始运行程序 |
display | disp | 跟踪查看某个变量,每次停下来都显示它的值 |
step | s | 执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 |
next | n | 执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) |
p | 打印内部变量值 | |
continue | c | 继续程序的运行,直到遇到下一个断点 |
set var name=v | 设置变量的值 | |
start | st | 开始执行程序,在main函数的第一条语句前面停下来 |
file | 装入需要调试的程序 | |
kill | k | 终止正在调试的程序 |
watch | 监视变量值的变化 | |
backtrace | bt | 查看函数调用信息(堆栈) |
frame | f | 查看栈帧 |
quit | q | 退出gdb |
3. 开始调试GreatSQL源码
第一次运行gdb准备调试时,可能会提示类似下面的信息
这表示缺少一些相关的debuginfo包,可以根据提示内容补充安装,例如:
如果提示找不到这些安装包:
可以检查yum配置文件 /etc/yum.repos.d/CentOS-Linux-Debuginfo.repo
,确认是否设置了 enable = 1
,例如:
此外,还要把GreatSQL 8.0.25-16的源码包解压缩到 /opt 目录下:
接下来,演示如何跟踪调试。
先初始化GreatSQL数据文件,然后再启动GreatSQL服务进程:
启动gdb,准备调试跟踪GreatSQL,我们分别演示几种不同方式。
3.1 利用gdb设置断点
在 终端#1
中启动gdb,并挂接GreatSQL进程,准备跟踪
切换到 终端#2
,随便执行一条SQL命令:
回到 终端#1
,继续调试:
切回 终端#2
查看SQL语句执行结果:
可以看到,因为一直被阻塞,这条SQL请求耗时超过12分钟。当 终端#2
的连接断开退出后,可以看到gdb端也有相应提示:
如果不想继续跟踪调试了,只需输入指令 q
或 quit
即可退出gdb。
3.2 使用 Trace 文件调试
还可以在GreatSQL客户端中设置变量 debug
为不同值,就可以输出GreatSQL运行过程中涉及的调用模块、函数、状态信息等全部信息,并记录到本地文件中。用法示例:
变量 debug
支持多种设置模式:
+
, -
表示从当前debug值添加或者减少某些选项。
flag相关可选项如下:
flag | 说明 |
d | 开启DBUG |
f | 只跟踪指定的函数 |
F | 跟踪指定的源码文件 |
i | 跟踪指定的线程 |
L | 跟踪指定的源码行数 |
n | 打印函数调用层次序号 |
N | 输出日志从0开始打印行号 |
o | 指定输出到某个文件 |
O | 类似o,每次写文件都会flush,reopen |
P | 匹配DBUG_PROCESS |
p | 打印process name |
t | 打印函数调用和退出 |
使用案例1(精简模式)
查看生成的trace文件:
使用案例2(复杂模式)增加了打印文件名和行号等信息,更方便定位查找。
查看生成的trace文件:
本文简单演示了如何跟踪调试GreatSQL的几种方法,更多有趣实用的方法还有待进一步挖掘,一起探索新世界吧。
P.S,我也在MacOS环境下构建了基于vscode的跟踪调试环境,但还是更喜欢在Linux终端命令行模式下工作,所以本文没介绍如何利用vscode跟踪调试,有兴趣的读者可以根据其他资料自行构建。
文章转载自公众号:GreatSQL社区
