9

快速编译调试 Redis

 4 years ago
source link: https://zhuanlan.zhihu.com/p/67205845
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

快速编译调试 Redis

中华儿女多奇志,不爱无码爱代码

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源码世界,有兴趣的同学可以关注下后续文章,一起学习。

听说喜欢点关注的同学都长得帅


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK