今天费了些周折,总算搭建好了MySQL源码的调试环境,主要的目的就是想在看代码的时候有一些头绪,让这些开发技巧派上用场。不至于盲人摸象一般的拿着命令肉眼扫视,当然对于代码至于能不能啃下来,那是另外一回事了。
我来说说我的情况,Java开发还有一点基础,所以以前的eclipse还算用得比较熟悉。大家知道InnoDB的源码是c,MySQL Server的是c++,这样一套环境想调试好,如果没有这方面的平台开发经验其实还是有一点难度的。最后我还是决定使用eclipse来做,基于Windows平台。
里面趟了好几个坑,让我苦不堪言。
先要做几件事情
1)下载MySQL源码
2)下载开发IDE eclipse
3) 编译环境调试
4) 配置代码调试方式
下载MySQL源码MySQL源码的下载,直接到www.mysql.com上面,选择社区版,下载类型是source code,就可以看到下面的选项了。
比如说我选择的是这个5.6.35的版本。最新的是5.7的,再早一些的是5.5版本的,之前的还真不好找了,得通过其他渠道了。
下载IDE eclipseeclipse是个开发通用平台的IDE,不过这个说法现在受到了IntelliJ IDEA的挑战,目前来看挑战成功,其中有一部分原因和新版本的一些界面的改进有关,不过相对来说eclipse这个工具Java开发者用得多一些,有些面试里还会问里面的几个快捷键,一问就能问出来i用得怎么样。可能有的朋友就会问,eclipse是Java开发用得多一些,那和MySQL源码环境有什么关系。难道在里面用Java编辑器看c++代码,非也。
因为eclipse还是有c++版的插件的,可以在www.eclipse.org上面下载c++版本专属的。
但是下载之后,启动eclipse失败,错误是Failed to load the JNI shared library jvm.dll”,这个错误的大多数说法是和JDK的位数有关,比如32位,64位的兼容性有关,当前的环境是一个JDK6的环境,看来孩不够,我再下载个JDK7的试试。官网已经直接下载不了了,得通过mos下载。
配置好环境之后,收到的错误变样了,我感觉被这个错误玩弄了。
一个IDE升级那么新版本的JDK干什么,然后又这回来下载JDK8。官网下载的还是安装版的。我就默默的看着下面的这个霸气的硬广,直到安装成功。其实相对来说,我还是喜欢解压版的。
eclipse可以启动了,我创建了一个项目,我命名为mysql_5_6_35
这个时候环境还是基本空白的,先创建好再说。
简单确认之后,就创建好了一个项目,新版本的exlipse就开始生成了工作目录。启动的界面还是不错的。
编译环境调试启动了eclipse,创建了项目,我们可以从指定的目录下导入源码包里的代码。当然不出所料,打开代码之后,发现后台开始报出了下面的错误。编译环境就有有问题。
这个时候如果能配置好还是很有意思的,可以在windows上来安装一下gcc,g++的环境,可以参考https://sourceforge.net/projects/mingw/这个网站,下载即可。
这个软件的风格蛮有意思,下载安装包的时候是下面的安装进度,需要安装哪些插件,也基本是这样的形式。
我们不光要gcc的,还要g++,在安装好的软件基础上需要再下载新的包来安装。最后会提示安装成功。
在eclipse里面还是需要做一些基本的配置的。根据红色的框图找到对应的菜单,修改右下角的路径,这个路径就是我们刚刚安装的软件所在的目录。
比如我安装在了D盘,就配置成下面红框的路径。
这个时候还有一个问题,提示make没有配置,这个问题可让我有些摸不着头脑。gcc都装了,make检查了也是安装成功的,为什么提示配置里没有呢。这里有一个梗。我们需要把下面的文件改个名字,其实它就是make
配置好环境,编译就大体没有问题了。
其实上面的环境配置也算是一个辅助,如果我们只是看看代码,其实也能接受,不过下面的这个功能用不了,查看代码就会困难重重。比如我鼠标点击到代码里的某一个方法,根据调用关系我能够很快定位到另一个文件的调用函数,如此一来查看逻辑就会清楚许多。
但是这个功能在eclipse竟然用不了,熟悉Java开发的同学应该都熟悉这个outline的功能,一个文件里面有哪些函数,哪些变量都可以一目了然,所以这种情况得改进,发现无法启用的原因是我打开的其中一个文件的代码行数超过了5000行。默认eclipse的配置,超过5000行就启用不了outline了,我们改一下红框的配置即可。
配置好之后,重启eclipse就没问题了,可以看到右边的outline信息,求会清晰很多,点击代码也会有这种定位功能,这下看代码就方便多了。比如我们查看InnoDB的代码,到storage/Innobase/handler/ha_innodb.cc这个文件,这会是我学习innodb的一个关键接口文件。