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

一:背景

1. 讲故事

记得在很久之前给初学的朋友们录制 redis 视频课程,当时结合了不少源码进行解读,自以为讲的还算可以,但还是有一个非常核心的点没被分享到,那就是源码级调试, 对,读源码还远远不够,还得亲自实操,为了弥补这个遗憾,这一篇就补起来哈。

二:vscode 和 redis 的部署

1. 平台和调试工具

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

扯这么多的意思就是想说不要指望用 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 的启动图标了,🐂🙅‍🐂。

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

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

三: vscode 调试 redis

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

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

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

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

再配置一下启动文件 .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\""
		]
	}]
}

4. 调试执行

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

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

  • client 端

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


  • server 端

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

四:总结

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

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

优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/u/135083/blog/4691811

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。