源码都没调试过,怎么能说熟悉 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 上的安装
官方地址下载 vscode,这里我用的版本是 1.23,参考网址:https://code.visualstudio.com/updates/v1_23
[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 调试之旅!
源码都没调试过,怎么能说熟悉 redis 呢?相关推荐
- android面试 源码,Android面试题-onCreate源码都没看过,怎好意思说自己做android-Go语言中文社区...
自定义控件 联网 工具 数据库 源码分析相关面试题 Activity相关面试题 Service相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试 ...
- 连Spring源码都没看过,你怎么敢在简历上写“精通”?
小A 你好面试官,非常高兴能参加今天的面试 面试官 没事,先做一个自我介绍吧 小A 我叫小A,工作三年了,做过...... 面试官 嗯,好的,看到你的项目这块,在公司主要用的就是spring全家桶相关 ...
- 为了彻底搞懂 hashCode,我连 JDK 的源码都没放过(建议收藏)
今天我们来谈谈 Java 中的 hashCode() 方法--通过源码的角度.众所周知,Java 是一门面向对象的编程语言,所有的类都会默认继承自 Object 类,而 Object 的中文意思就是& ...
- 连这几个源码都没啃透,那面试高级开发的事等等再来!
前不久参加了一个线上技术交流会,有三四十岁的技术管理者,当然也有刚刚进入程序员行业的新手.全程的讨论都很热烈,其中有这样一个问题,"新技术层出不穷,而作为处在旋涡中心的程序员该如何应对?&q ...
- 下载安卓源码都干了什么?
闲来无事,想瞅瞅安卓wifi的框架是什么样子滴,就有了如下的记录 目录 1.准备linux系统 2.创建samba共享目录 4.下载源码 5.下载repo 6.同步代码 7.完成同步,开始阅读 1.准 ...
- android 仿网易新闻客户端源码都有
原文:android 仿网易新闻客户端源码都有 android 仿网易新闻服务端源码 源代码下载地址: http://www.zuidaima.com/share/1550463560944640.h ...
- 免费开源!新学期必收藏的AI学习资源,从课件、工具到源码都齐了
(图片付费下载于视觉中国) 整理 | Jane 出品 | AI科技大本营(ID:rgznai100) 2019 年 3 月 28 日,教育部公布了 2018 年度普通高等学校本科专业备案和审批结果,共 ...
- 起飞,会了这4个 Intellij IDEA 调试魔法,阅读源码都简单了
前言 上一篇文章 IntelliJ IDEA 高级调试之Stream Trace 算是 IntelliJ IDEA 高级调试技巧的开胃菜,很多小伙伴被这个小技巧征服.趁热打铁,今天给大家带来几个我日常 ...
- 面试了10几家公司后被怼,逼的我把源码都吃透了,最终成功入职阿里
从三月底开始投递简历,甭管是什么公司,只要薪资待遇跟之前差不多我都投了.最气人的一次面试经历是一个小公司的HR约我面试,我过去了,填完表格,还没到技术面呢,她看到我的期望薪资是15k+,直接来了一句: ...
最新文章
- 2022-2028年中国可降解聚乙烯农用地膜产业竞争现状及发展规模预测报告
- 链式运动JavaScript实现
- linux关闭内核命令,Linux内核关闭IPv6协议的方式
- 系统调用软中断处理程序system_call分析
- 参考ethtool写了个Linux设置、获取网卡模式的接口
- Tableau可视化学习笔记:day07-08
- 简易web服务器系统毕业论文设计,毕业论文 简易的WEB服务器的设计
- Java8 - Stream API快速入门
- Linux下安装Solr7.2.1以及配置Solr(CentOS7)
- c programe language learn notes 3
- 不仅仅是游戏,王者荣耀如何突破次元壁?
- android tv字体,android TV 屏幕适配 (一)
- 一场跨越时空的协奏:编钟、古琴与5G的“弦外之音”
- 为什么要有Git暂存区
- tiny服务器系列,温州中学TinyWebDB服务器正式启用
- 币圈暴涨暴跌有这五大技巧就够了
- opencv python 调用网络摄像头 (局域网)
- JAVA特点优点以及环境
- English语法_形容词/副词3级-比较级_常用短语
- 【把图片制作成电子书】名编辑电子杂志大师教程 | 导入图片转换成电子杂志