gdb在分布式工程调试的方面很强大,因此用他来初步设断点调试一下TiDB
调试需要先部署TiDB环境,本文使用的是Docker-compose快速部署TiDB
gdb调试
首先启动TiDB,使用Mysql客户端连接TiDB服务器
启动TiDB参考之前文章
查看当前进程
ps -el | grep server
ps命令查看当前进程,参数e为显示所有进程,l为显示长列表
grep命令找到带server的进程
TiDB成功启动
有三个进程
- tidb-server
- pd-server
- kv-server
My客户端连接
确保Mysql客户端能连接到TIDB上
登陆Mysql
mysql -h 127.0.0.1 -P 4000 -u root
- -P为端口号
- -u为连接的用户
gdb知识
① 如何进入gdb ?
|- gdb attach processID(注意此processID的程序的编译选项必须有-g,即有调试信息,即程序的可执行文件(.o)为debug版
② 如何添加断点 ?
|- 添加断点可使用:b 源文件(***.cpp):具体代码行(大于0,小于源文件代码行)
|- 添加断点请详细查阅当前调试程序的源代码版本,调试程序和源代码必须是同一版。
|- 添加断点请查阅具体版本代码
|- 可以使用如下命令查看短信信息
|- info breakpoints
③ 执行到断点处,如何查看信息 ?
|- 断点可查阅的信息与当前context有关,可以对照源代码断点位置,查阅可查看变量信息
|-可以如下命令打印变量
|- print 变量名
|- p 变量名
|- bt 可查阅当前栈信息
④ 执行到断点处,如何继续执行 ?
|- 执行到断点处,可以使用命令:n即next,执行程序(源代码而非指令)下一行
|- 执行到断点处,也可以使用命令:c即continue,执行程序,除非遇到断点,否者将不暂停
⑤ 如何退出gdb ?
|- 使用命令:q,即可退出gdb
gdb调试
打开新的终端执行命令进入gdb调试
gdb
gdb绑定进程
使用ps命令已经查看到启动的进程,绑定tidb-server测试
attach 2946
更改gdb调试目录
dir /home/zhangboo/goProject/src/github.com/pingcap/tidb
tidb目录下存放的就是对应代码的目录
设置断点
b builder.go:15
上述命令表示在builder.go的15行处设置断点
进入mysql客户端,连接数据库,随机测试一条命令,在断点处停下
使用bt
查看当前栈的信息
使用c
进行单步调试
gdb常见命令
break NUM 在指定的行上设置断点。
bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。
clear 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。
continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而
导致停止运行时。
display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。
file FILE 装载指定的可执行文件进行调试。
help NAME 显示指定命令的帮助信息。
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
info var 显示所有的全局和静态变量名称。
kill 终止正被调试的程序。
list 显示源代码段。
make 在不退出 gdb 的情况下运行 make 工具。
next 在不单步执行进入其他函数的情况下,向前执行一行源代码。
print EXPR 显示表达式 EXPR 的值。