ide在控制台输入编译命令_快速编译调试 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,成功启动后可以看见如下界面:

v2-e16e4677499b7f4dc68d35238a744f65_b.jpg

第二步:在 t_string.c 的 setCommand(client *c) 上打上断点,这个方法是 Redis 用来 set 字符串结构的,也就是我们经常使用的 set 命令。

第三步:新开一个终端,执行 redis-cli,启动客户端,用来连接 redis 服务。

v2-d7ee43354ad846ffa780af7af4378a8b_b.png

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

v2-59a1f2ab82c3eb35d402d92869345fe9_b.jpg

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

v2-0821c21d662be52e2526f1e878ed989d_b.jpg

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

v2-5da63e5dd6f5a320d4b36e1c1b97cc6a_b.jpg


key 和 val 的值和我们在客户端 set 的值相同,符合预期。

因为我用的 mac,所以上面演示用的是 lldb,习惯用 gdb 的同学当然也可以使用 gdb 来调试,只需将调试配置中的 MIMode 改成 gdb 即可。

四:多聊几句

调试在源码阅读的过程中真的很重要,上面这些虽然简单,但是我之所以写下来,还是希望对于想阅读源码的同学能带来一点帮助。

后面的文章中,我就会由浅入深,如标题所言,开始进入Redis源码世界,有兴趣的同学可以关注下后续文章,一起学习。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java增强枚举的用例

Brian Goetz在消息“ 增强枚举-用例 ”中写道&#xff1a;“我们希望就现在实现的功能[ 增强枚举 ]获得用户反馈。” 他陈述了他的信息的第一个目的&#xff1a;“开始工作&#xff0c;这是一些通用枚举可能有用的典型用例。” 所提供的两个示例中的第一个示例是重构com.sun.to…

图片上传获取名字

Override public ResultResponse<String> uploadImg(MultipartFile file) { String imgUrl null; try { //MultipartFile类中两个方法区别&#xff1a;//getName : 获取表单中文件组件的名字//getOriginalFilename : 获取上传文件的原名 String name file.getOriginalF…

tf.nn.softmax

通过Softmax回归&#xff0c;将logistic的预测二分类的概率的问题推广到了n分类的概率的问题。通过公式 可以看出当月分类的个数变为2时&#xff0c;Softmax回归又退化为logistic回归问题。 下面的几行代码说明一下用法 # -*- coding: utf-8 -*- import tensorflow as tfA […

python easygui_python简单图形界面GUI入门——easygui

首先是easygui包下载&#xff0c;两种方式&#xff1a;1)在命令行提示符环境下&#xff0c;用pip install easygui直接安装&#xff1a;2)从http://easygui.sourceforge.net下载。将下载得到的easygui.py文件&#xff0c;复制到Python安装路 径下的Lib文件夹中。等待安装完成即…

使用 Python ElementTree 生成 xml

Python 处理 xml 文档的方法有很多&#xff0c;除了经典的 sax 和 dom 之外&#xff0c;还有一个 ElementTree。 首先 import 之&#xff1a; 1from xml.etree import ElementTree as etree然后开始构建 xml 树&#xff1a; 1234567891011121314from xml.etree.ElementTree imp…

卷积核输出维度计算

1&#xff09;卷积层&#xff1a; 参数&#xff1a;W&#xff1a;宽&#xff1b; H&#xff1a;高&#xff1b; D&#xff1a;深度&#xff1b; K&#xff1a;卷积核的个数&#xff1b; F&#xff1a;卷积核的大小&#xff1b; S&#xff1a;步长&#xff1b; P&#xff1a;…

接受与返回json数据

转载于:https://www.cnblogs.com/classmethond/p/10801606.html

归一化方法列举

归一化方法&#xff1a;除以序列最大值的&#xff0c;叫峰归一化&#xff1b;除以序列之和的&#xff0c;叫面积归一化&#xff1b;除以序列的模&#xff0c;叫数值归一化&#xff0c;得到序列的方差为0&#xff0c;均值为1&#xff1b;(1) 线性函数转换&#xff0c;表达式如下…

定时器和promise_手写Promise核心原理,再也不怕面试官问我Promise原理

整体流程的介绍 整体流程的介绍1. 定义整体结构2. 实现Promise构造函数3. 实现then方法3.实现catch方法4. 实现Promise.resolve5.实现Promise.reject6.实现Promise.all7.实现Promise.race文章会配合例子来讲解为什么要这么实现&#xff0c;尽我所能讲得粗俗易懂。有什么不理解或…

在Java 9中使用sun.misc.Unsafe

Java 9 EA版本已经发布&#xff0c;现在我们可以看到如何使用sun.misc.Unsafe。 我领导了公开运动&#xff0c;以保留对Java 9的访问&#xff0c;该访问最终成功&#xff0c;从而导致对JEP 260的修订。 那么&#xff0c;事情如何结束&#xff1f; 设定 首先&#xff0c;您需要…

惊现神作!!!

发现穿越类小说 《穿越位面的狂人》 起点地址&#xff1a; https://book.qidian.com/info/1010641845 小说名《位面穿梭之宿舍电梯》改为《穿越位面的狂人》nx大学大一学生柳风&#xff0c;因经济拮据&#xff0c;不得不住在宿舍楼顶的一间破屋子里&#xff0c;半夜下楼上厕…

[HNOI2019]校园旅行

题目 过于神仙啊&#xff0c;抄题解.jpg 首先\(n\)并不是很大啊&#xff0c;我们可以直接用\(f_{i,j}\)表示\(i\)到\(j\)是否存在一个回文路径 对于一条回文路径&#xff0c;如果在两端分别添加一个相同的字符&#xff0c;那么仍然是一个回文路径&#xff0c;于是我们可以利用这…

Your CPU supports instructions that this TensorFlow binary was not compiled to use AVX AVX2

大致的原因就是说&#xff1a;tensorflow觉得你电脑cpu还行&#xff0c;支持AVX&#xff08;Advanced Vector Extensions&#xff09;&#xff0c;运算速度还可以提升&#xff0c;所以可以开启更好更快的模式&#xff0c;但是你现在用的模式相对来说可能不是那么快&#xff0c;…

安卓 sharedpreferences可以被其它activity读取_Google|再见 SharedPreferences 拥抱 Jetpack DataStore...

Google 新增加了一个新 Jetpack 的成员 DataStore&#xff0c;主要用来替换 SharedPreferences&#xff0c; DataStore 应该是开发者期待已久的库&#xff0c;DataStore 是基于 Flow 实现的&#xff0c;一种新的数据存储方案&#xff0c;它提供了两种实现方式&#xff1a;Proto…

【20171025早】alert(1) to win 练习

本人黑绝楼&#xff0c;自称老黑&#xff0c;男&#xff0c;25岁&#xff0c;曾经在BAT工作过两年&#xff0c;但是一直都是底层人员&#xff0c;整天做重复性工作&#xff0c;甚敢无趣&#xff0c;曾和工作十年之久的同事聊天&#xff0c;发现对方回首过往&#xff0c;生活是寡…

Arduino 与 SPI 结合使用 以及SPI 深层理解

本文主要讲解两部分内容&#xff0c;不做任何转发&#xff0c;仅个人学习记录: 一. Arduino 与 SPI 结合使用 &#xff1a; 二. SPI 深层理解 有价值的几个好的参考&#xff1a; 1. 中文版&#xff1a; https://blog.csdn.net/xxxxxx91116/article/details/42620413 这版本适…

VGG

VGG16网络&#xff0c;卷积核3*3&#xff0c;步长为1&#xff0c;填充&#xff08;padding&#xff09;为1&#xff1b; 池化2*2&#xff0c;步长为2 全连接层 卷积核1*1 Input Layer&#xff1a;224*224*3图像 Conv1-1 Layer&#xff1a;包含64个卷积核&#xff0c;kernal s…

guava 并发同步_Google Guava –与Monitor同步

guava 并发同步Google Guava项目是每个Java开发人员都应该熟悉的库的集合。 Guava库涵盖了I / O&#xff0c;集合&#xff0c;字符串操作和并发性。 在这篇文章中&#xff0c;我将介绍Monitor类。 Monitor是一种同步构造&#xff0c;可以在使用ReentrantLock的任何地方使用。 随…

qt 定时器_Qt开源作品23-颜色拾取器

## 一、前言在做很多项目的UI界面的时候&#xff0c;相信绝大部分人都有过抄袭别人的UI界面尤其是颜色的时候&#xff0c;毕竟十个程序员九个没有审美&#xff0c;或者说审美跟一坨屎一样&#xff0c;大家主要的精力以及擅长点都是在写功能实现具体功能上面&#xff0c;这个事情…

第5章学习小结

第五章主要学习了树的知识&#xff0c;以前一直很好奇&#xff0c;为什么电脑能存储像树一样的数据结构&#xff0c;学完才发现&#xff0c;ADT加数组或者ADT加链表真的可以衍生出多种多样的数据类型&#xff0c;以下做出本章小结&#xff1a; 1.利用ASCII码实现不同类型的数据…