废话又说,了解一套系统的最好方式就是看他的源代码了,个人觉得看源代码的最好步骤就是:
- 熟悉该系统的使用方法
- 熟悉该系统的开发手册
- 看别人对系统结构、架构的介绍
- 对源代码进行实地的调试跟踪
对于mysql,很多同学对于前三步应该都很熟悉了,那么我们来看看如何对mysql进行源代码级别的调试呢?
- 下载mysql的源代码包:http://dev.mysql.com/downloads/ 大家挑选你喜欢的就可以了,我以mysql-5.5为例
- 解压缩下载的源代码包,然后就是大家非常熟悉的三部曲:
- ./configure
- make
- make install
- 为了能够更好的调试,在configure这个步骤我们需要传递一些参数给它:—prefix=/home/zhangzhong/mysql-dev –with-debug=full
- 进入mysql的安装目录:
- 根据你自己的需求,定制一个mysql的配置文件my.cnf,建议配置最少的参数:
- 配置port和socket就够了
- 使用mysql_install_db脚本进行初始化配置工作,命令如下:
- ./scripts/mysql_install_db --defaults-file=./my.cnf --basedir=/home/zhangzhong/mysql-dev --datadir=/home/zhangzhong/mysql-dev/var --skip-networking 该脚本可以协助你完成系统表的设置和授权等其他工作
- 进行debug调试:
- gdb ./bin/mysqld
- r --defaults-file=./my.cnf --datadir=/home/zhangzhong/mysql-dev/var --skip-networking --gdb 记住--gdb选项比较重要,如果不加这个选项的话,你在gdb里面就不能使用ctrl-C将mysql进程中断下来了
- 好了现在你可以随心所欲的对mysql进行调试了
- 举一个实例
create table test.test(name char(10), id int)
select name from test.test where id = 1;
对于上面这个最简单的sql,我想知道mysql是怎么做完一系列操作的,应该怎么做呢?
-
定断点:
-
ctrl-c在gdb里面先让mysql中断下来
-
设置断点,break mysql_select
-
-
run
-
执行sql”select name from test.test where id = 1”
-
我们可以看到mysql已经乖乖的在你的断点处停下来了,呵呵接着就发挥你对代码的钻研精神和gdb的熟练使用了