27

源码都没调试过,怎么能说熟悉 redis 呢?

 3 years ago
source link: https://segmentfault.com/a/1190000037629042
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.

一:背景

1. 讲故事

记得在很久之前给初学的朋友们录制 redis 视频课程,当时结合了不少源码进行解读,自以为讲的还算可以,但还是有一个非常核心的点没被分享到,那就是源码级调试,

对,读源码还远远不够,还得亲自实操,为了弥补这个遗憾,这一篇就补起来哈。

二:vscode 和 redis 的部署

1. 平台和调试工具

大家都知道 官方版redis 是不支持 windows 的,即使被微软开源技术社区移植到了 windows 平台,版本滞后就不说了,无数潜在的 bug 可能会让你望而却步,gitbub地址: https://github.com/microsofta... 目前最新的版本是 3.0.5, 官方都已经是 6.0.9 啦! :open_mouth:

eyAJVzI.png!mobile

扯这么多的意思就是想说不要指望用 windows + visualstudio 调试源码,更何况这里还要调试最新版的 redis6, 只能上 centos + vscode 了哈

2. vscode 在 centos 上的安装

[root@localhost data]# wget https://vscode.cdn.azure.cn/stable/d0182c3417d225529c6d5ad24b7572815d0de9ac/code-1.23.1-1525968555.el7.x86_64.rpm
--2020-10-27 07:03:08--  https://vscode.cdn.azure.cn/stable/d0182c3417d225529c6d5ad24b7572815d0de9ac/code-1.23.1-1525968555.el7.x86_64.rpm
Resolving vscode.cdn.azure.cn (vscode.cdn.azure.cn)... 119.39.80.117, 14.204.144.133, 153.37.238.225, ...
Connecting to vscode.cdn.azure.cn (vscode.cdn.azure.cn)|119.39.80.117|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 69499838 (66M) [application/x-redhat-package-manager]
Saving to: ‘code-1.23.1-1525968555.el7.x86_64.rpm’

100%[===================================================================================================================>] 69,499,838  3.36MB/s   in 19s    

2020-10-27 07:03:28 (3.40 MB/s) - ‘code-1.23.1-1525968555.el7.x86_64.rpm’ saved [69499838/69499838]
  • 安装 vscode 的依赖包 libXScrnSaver, nss
[root@localhost code]# yum install libXScrnSaver-devel.x86_64 libXScrnSaver.x86_64 && yum install nss
  • rpm 安装 vscode
[root@localhost data]# rpm -ivh code-1.23.1-1525968555.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:code-1.23.1-1525968555.el7       ################################# [100%]

安装完后就可以在 centos 上找到 vscode 的启动图标了,:ox::no_good:‍:ox:。

bIVRVrv.png!mobile

3. redis6 源码下载

这里有一个坑要提醒一下,如果你编译 redis6 的话,centos7 的 gcc 默认是 4.8.5,你需要升级一下:

[root@localhost redis-6.0.9]# gcc -v
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
[root@localhost ~]# yum -y install centos-release-scl
[root@localhost ~]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@localhost ~]# source /opt/rh/devtoolset-9/enable
[root@localhost redis-6.0.9]# gcc -v
gcc version 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC)

然后就可以源码下载,编译,启动,直接参考官方文档来: https://redis.io/download

$ wget https://download.redis.io/releases/redis-6.0.9.tar.gz
$ tar xzf redis-6.0.9.tar.gz
$ cd redis-6.0.9
$ make
$ src/redis-server

没什么好说的,执行完后的启动界面如下:

7vIJNzN.png!mobile

三: vscode 调试 redis

1. 使用 vscode 安装 c/c++ 扩展

具体用法和 windows 上的 vscode 差不多,该怎么装还怎么装。

r2YVjmj.png!mobile

2. 使用 debug 生成 launch.json 启动文件

菜单栏 "Debug" -> "Starting Debug",然后选择 "C++ (GDB/LLDB)",如下图:

Y36biyZ.png!mobile

再配置一下启动文件 .vscode/launch.json ,将 ${workspaceFolder}/src/redis-server 程序的路径配置在 program 节点下,如下代码所示:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/src/redis-server",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

3. 生成编译指令文件 tasks.json

在 .vscode 目录下新建 tasks.json,使用 make 命令编译 redis 源码,最后由 launch.json 读取生成好的 可执行文件 redis-server,代码如下:

{
    "version": "2.0.0",
    "tasks": [{
        "label": "Build",
        "type": "shell",
        "command": "make",
        "args": [
            "CFLAGS=\"-g -O0\""
        ]
    }]
}

jmyyYvI.png!mobile

4. 调试执行

在 server.c 中找到 main 启动函数,下一个断点过去,按 F5 执行,如下图可以看到断点已命中。

r2yURzf.png!mobile

为了更加逼真一点,我在 string.c 中的 setCommand 处设置断点,保证 redis-cli 在执行 set username jack 时断点命中。

  • client 端
[root@localhost src]# ./redis-cli
127.0.0.1:6379> set username jack
  • server 端

MBVzyiQ.png!mobile

怎么样,图中左侧面板中的 局部变量窗口,监控窗口,调用堆栈窗口,一目了然。。。

四:总结

总的来说,整个搭建过程有一定的繁琐度,但学啥又简单呢? 再说源码都没调试过,怎么能说熟悉 redis 呢?最后祝大家有一个开心的 redis 调试之旅!

更多高质量干货:参见我的 GitHub: dotnetfly


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK