【从入门到放弃-MySQL】CLion调试MySQL8.0源码

前言

想对的MySQL底层实现做一些了解,奈何没有用过C++不知道怎么调试一个大型项目,一日和大神交流时大神扔给我了一份《XCode调试MySQL8秘籍》。于是在几经波折(主要是因为菜)之后终于打开了MySQL的调试大门。

环境搭建

准备

MacOS: 10.14.5:因为根据大神秘籍,要使用Xcode,但Xcode下载目前只支持10.14.3,因此在10.13.6下强升的系统版本,Xcode下MySQL成功编译运行成功,但是遇到了诡异的调试无法的问题,排查无果最后转用CLion
CLion:2019.1.3
mysql源码:https://github.com/mysql/mysql-server
cmake和boost:brew install cmake boost

编译

MySQL源码目录:/var/workspace/mysql/mysql-8.0.16/
boost目录:/usr/local/Cellar/boost/1.68.0_1

1
2
3
4
5
6
7
8
9
10
11
12
13
cd /var/workspace/mysql/mysql-8.0.16/
mkdir work
cd work

cmake . -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX=/var/workspace/mysql/mysql-8.0.16/work -DMYSQL_DATADIR=/var/workspace/mysql/mysql-8.0.16/work/data -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DENABLED_LOCAL_INFILE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/Cellar/boost/1.68.0_1 -DFORCE_INSOURCE_BUILD=1

make -j 4

make install -j 4

cd /var/workspace/mysql/mysql-8.0.16/work

sudo bin/mysqld --basedir=/var/workspace/mysql/mysql-8.0.16/work --datadir=/var/workspace/mysql/mysql-8.0.16/work/data --initialize-insecure --user=mysql

如果最后一步执行出错可以参考https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html
新建mysql-files并修改权限

可能会有各种神奇的报错,主要是权限问题!
搞不定的话参考下面有最终的目录权限截图

配置

导入mysql-8.0.16项目,配置cmake参数

options参考编译过程中的cmake参数

选择mysqld 并编辑启动参数

arguments如下:

1
--basedir=/var/workspace/mysql/mysql-8.0.16/work --datadir=/var/workspace/mysql/mysql-8.0.16/work/data --user=mysql

启动调试,此时可能还会报错

还是权限问题。。。clion无法以root权限启动debug,尝试各种方法无效。因此把mysql的data目录改为777
最终目录权限如下图:

再此点击debug按钮,启动成功(注意没error了,可以用客户端测试启动成功了)。

调试

我们在代码中打上断点,客户端执行SQL语句时就能在断点处看到各变量信息了,比如图中的SQL解析。

可以看到执行阻塞了

Clion代码调试的具体方法不做赘述了,网上一堆。

总结

之前一直想调试MySQL,但是总是没有迈出第一步,代码下载下来就完事儿了。这次一鼓作气走了下来,希望能开个好头,养成各种代码调试的好习惯。看代码中细节比任何文档中都来的扎实(当然,时间充裕前提下)。
搭建环境的过程中遇到了很多问题,Google、百度无数遍都没有能解决问题,最终还是通过MySQL的官方手册找到的答案。MySQL的官方手册简直神器,大家可以好好利用起来。
C++的知识仅停留在大学课本阶段,阅读源码简直困难,要能坚持下去,加油!