一 如何根据gdb 调试mysql
1 安装gdb
2 gdb -p process_id
3 如何设置断点
1 在具体函数模块下设置 DBUG_ENTER("");
2 b 函数模块名称
3 bt
4 由于gdb会导致其他session操作卡住
1 设置next mysql从登录到执行sql都会被卡住,需要一段段进行调试
2 设置contine mysql登录需要执行c,如果没有断点就一直运行,不会阻塞登录后的任何操作,直到再次遇到断点操作
5 结束进程
kill -9 gdb 即可
6 生成core文件
使用'gcore core_name'命令生成coredump文件core_name。此命令会监控进程状态,然后捕捉异常,生成二进制文件
使用'detach'命令断开连接。
7 分析core文件
gdb core_name
8 常用命令 disass bt
mysql源码目录
1 sql目录 mysql大部分源码都存储在这里,包括main()函数,我们主要关注的就是这个
2 plugin目录 部分插件源码所在地,包括半同步复制
3 client目录 mysql客户端工具源码
mysql源码编译安装和调试mysql源码包下载安装
1 源码下载地址
https://dev.mysql.com/downloads/mysql/
选择 scode下载你需要的测试版本
2 测试环境安装软件
安装 cmake,bison
3 编译安装mysql
1 参数需要加入 --DWITH_DEBUG=1
2 最终编译参数
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \
-DSYSCONFDIR=/data/mysql/ \
-DMYSQL_DATADIR=/data/mysql/data/ \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1
make -j `grep processor /proc/cpuinfo | wc -l`
make install
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
3 启动服务
4 gdb设置
1 常用命令
info threads:查看全部线程
thread n:指定某个线程
bt:查看某个线程栈帧
b:设置断点
c:继续执行
s:执行一行代码,如果代码函数调用,则进入函数
n:执行一行代码,函数调用不进入
p:打印某个变量值
list:打印代码的文本信息
2 gdb启动mysql
mainrun --defaults-file=/etc/my.cnf --user=mysql --gdb > debug.txt
gdb -x /root/debug.file /usr/local/mysql/bin/mysqld
3 设置断点
b binlog_cache_data::flush
4 gdb执行c(continue)->加载具体线程需要一段时间
5 客户端可以连接进入
6 测试
客户端执行事务提交,commit会卡出并抛出断电信息
bt进行查询线程栈帧