开篇说明
本系列分析的源码就是《Redis设计与实现》的作者黄建宏大佬在github上开源的redis-3.0-annotated,因为里面注释多,更容易分析一些。你可能会问,都有《Redis设计与实现》这本书了,为什么还要写这几篇文章呢?
看过那本书的人都知道,书中主要是对代码原理的总结性讲解,没有带着读者对着源码一步步梳理流程, 所以刚开始看着可能会有点懵,所以我这几篇就起到类似于导读的作用,先带着读者大体上梳理一遍Redis源码的执行流程,以及里面的关键代码,估计会有四篇文章。
第一篇文章先讲解调试环境搭建。
因为我本人主要是写Java的,有强烈的IDE依赖症,不喜欢使用文本编辑器或者命令行这样的工具,所以选择使用CLion搭建一个IDE环境来辅助阅读。
但是CLion主要支持的是CMake管理的项目,而Redis是用普通的Makefile管理的,所以需要一些技巧来配置环境。
支持跳转
CLion从2018.2版本开始支持通过compiledb来让Makefile的项目支持跳转重构等高级功能。
首先安装compiledb:
pip install compiledb
务必在用CLion打开Redis项目之前进入Redis根目录,运行下面的命令:
compiledb -nf make
之后会在项目根目录下生成一个compile_commands.json
文件。
之后再用CLion打开Redis项目,这样CLion就会自动检测到compile_commands.json
,就可以读Redis源码时进行各种跳转了。
调试Redis
完全上面的步骤后,依旧只能把CLion当个阅读器来读代码,无法单步调试的话还是不方便理解源码。
经过一番研究,发现可以使用CLion的”GDB Remote Debug”的功能对Redis的二进制结合源码进行调试。
首先,要编译出一个专门用于debug的二进制,make
默认采用的编译优化级别的是-O2
,代码优化会影响我们调试,所以我们编译一个没有优化的版本便于调试:
make noopt
之后使用gdbserver
来执行该二进制(如果还有安装的话,就先安装gdbserver
):
gdbserver :43211 ./src/redis-server
上面命令表示在43211端口启动一个gdbserver
,用于调试二进制./src/redis-server
。
之后在CLion上进行配置Run -> Edit Configurations
:
打好断点,点击右上角的小虫子,就可以开心地调试Redis了。
调试的截图如下:
目前发现该调试方法的一个问题就是当gdbserver
退出后,它所启动的二进制进程依旧不会退出,需要手动kill一下,以免占用端口影响下次debug:
$ ps -ef | grep ./src/redis
dqyuan 11842 1 0 21:40 pts/5 00:00:00 ./src/redis-server *:6379
dqyuan 12266 26302 0 21:43 pts/2 00:00:00 grep --color=auto ./src/redis
$ kill -9 11842