一:开篇
Redis 它是个宝,男女老少都说好。秒杀限流分布式,什么需求都能搞。
Redis 主要的用途是分布式缓存,其实不用我多介绍,相信大家都用过Redis。之前也看过不少Redis的书,其中就包括《Redis设计与实现》。但还是那句老话:纸上得来终觉浅,绝知此事要躬行。从这篇文章开始,我会去探索 Redis 源码,真真切切的去了解它的设计与实现。
阅读源码离不开调试,本篇文章主要是讲如何调试 Redis 源码,很基础,主要是面向没有过 VS Code 调试经验的同学,免的大家还需要自己去Google,浪费时间。
二:物料
源码地址:https://github.com/antirez/redis (源码分析基于 5.0 版本)
IDE:VS Code
三:编译&调试
(1)编译
直接 cd 到源码根目录,执行 make 即可
(2)调试
这里我使用的 VS Code,导入源码后,直接添加调试配置如下:
{"version": "0.2.0","configurations": [{"name": "(lldb) Launch","type": "cppdbg","request": "launch","program": "你的源码路径/redis/src/redis-server","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": true,"MIMode": "lldb"}]
接下来就可以开始断点调试了,下面来演示下。
第一步:我们在 VS Code 中启动 Redis,成功启动后可以看见如下界面:

第二步:在 t_string.c 的 setCommand(client *c) 上打上断点,这个方法是 Redis 用来 set 字符串结构的,也就是我们经常使用的 set 命令。
第三步:新开一个终端,执行 redis-cli,启动客户端,用来连接 redis 服务。

第四步:执行 set 命令,如 set a "A",此时再回到 VS Code 中就会看见断点已经生效了。

第五步:接下来我们看看如何使用 lldb 打印内存。我们跟着上面这个断点往下走,进入 setGenericCommand() 中,停到 setKey(c->db,key,val); 这一行。

此时 key 和 val 的存储的数据内存地址 ptr 展现在上图左边的红框内,我们可以在调试控制台输入 -exec <lldb命令> 来执行lldb命令,下面我们来演示下如何打印出 key 和 val 的值。

key 和 val 的值和我们在客户端 set 的值相同,符合预期。
因为我用的 mac,所以上面演示用的是 lldb,习惯用 gdb 的同学当然也可以使用 gdb 来调试,只需将调试配置中的 MIMode 改成 gdb 即可。
四:多聊几句
调试在源码阅读的过程中真的很重要,上面这些虽然简单,但是我之所以写下来,还是希望对于想阅读源码的同学能带来一点帮助。
后面的文章中,我就会由浅入深,如标题所言,开始进入Redis源码世界,有兴趣的同学可以关注下后续文章,一起学习。
听说喜欢点关注的同学都长得帅