背景
工欲善其事,必先利其器,OceanBase 社区版代码量较大,在学习 OceanBase 代码时,需要有一款较好的源码阅读工具,来帮助大家更好地理解代码的执行流程、接口的层次关系等等。根据我在 OceanBase 6 年来的开发和阅读代码体验,一款较好的源代码阅读工具需要如下的一些功能:
- 按照符号搜索函数名、类名等
- 按照文本搜索文件名
- 文件内符号查找
- 按照文本搜索项目空间的字符串
- 查看类的继承关系
- 查看函数调用栈
- 查看某个变量的调用栈
- 跳转到某个函数的实现
上面的功能是在平时的开发和源码阅读过程中使用较多的功能,根据我目前的使用经验,有两款工具基本符合上面的条件,第一款是 Eclipse C/C++版本,第二款是 CCLS,可以在 vim 等编辑器中使用。本文将主要介绍 Eclipse 下的这些功能。
使用 Eclipse
下载
可以从 Eclipse 官网下载到 Eclipse C/C++,下载完成后,打开里面的 Eclipse 应用即可使用
导入 OceanBase 代码
从 Eclipse 的菜单栏 New->Makefile Project with Existing Code,导入 OceanBase 的源代码。项目生成后,Eclipse 会自动为代码构建索引,在普通的个人电脑上,索引的时间大约半个小时左右。
使用 Eclipse 阅读 OceanBase 代码
按照符号搜索函数名、类名等
在开发和源码阅读中,有时候我们记得某个函数或类的名字,但忘记所在代码文件了,此时,按照符号搜索函数名、类名功能就非常方便了。在 Eclipse 中,通过 Navigate->Open Element 使用该功能。
按照文本搜索文件名
有时候,我们知道某个功能的代码实现在某个文件内,但忘记了具体的函数名了,此时,我们可以结合按照文本搜索文件名,以及在文件内符号查找来找到对应的代码。在 Eclipse 中,通过 Navigate->Open Resource 使用该功能。
文件内符号查找
当我们定位到具体的代码文件后,如果需要在文件中查找对应的类、符号以及类内成员名等,可以使用该功能。在 Eclipse 中,打开某个代码文件后,通过右击鼠标->Quick Outline,在对应的搜索框里输入相应的符号即可查找。
按照文本搜索项目空间的字符串
有时候我们需要按照文本搜索匹配的代码,例如,在 OceanBase 中,内存分配是按照模块命名的,如果我们想查找使用某个模块名分配内存的代码,那么我们可以搜索该模块名的字符串来匹配代码。在 Eclipse 中,可以通过 Search->File 打开对应的搜索框,在里面输入想要查找的字符串。
查看类的继承关系
在 C++代码中,可能会使用继承来组织代码,有时候需要查看类的继承关系来看不同场景下的实现。在 Eclipse 中,通过光标选中类名,然后调用 Navigate->Open Type Hierarchy 来查看类的继承关系。
查看函数调用栈
在排查问题时,我们可能会碰到某个函数运行处理的结果不符合预期的情况,此时,我们可能需要通过函数调用栈来跟踪函数执行路径,来判断哪条路径可能出问题了。在 Eclipse 中,光标移动到函数名上,Navigate->Open Call Hierarachy。根据我在 MAC 开发环境的使用经验,Eclipse 能够快速又较为准确地对 OceanBase 这样体量代码的函数查看调用栈,其他的 IDE 暂时还不能够同时满足快速和准确。
查看某个变量的调用栈
有时候需要理解某个类内成员变量的作用,此时要查看其所有使用的地方。在 Eclipse 中,跟查看函数调用栈使用方式一样,可以查看某个变量的调用栈。
跳转到某个函数的实现
在我们学习某个功能的实现时,通常需要自上而下跟踪代码路径下的实现,因此,需要有跳转到某个函数实现的能力。在 Eclipse 中,将光标移动到调用的函数上,然后通过 Navigate->Open Declaration 跟踪到具体的实现。有时候跟踪到具体实现后,又希望回到之前的代码处继续跟踪下面的流程,此时可以通过 Navigate->Back 来回到之前代码处。
本文提到的代码查找功能同样适用于任何其他 C/C++项目,如果有学习其他 C/C++代码的需求,也可以作为参考。