曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java同样的效果

概要

最近写了spring系列,这个系列还在进行中,而后有些同窗开始叫我大神,而后觉得我各方面都比较厉害,固然了,我是有自知之明的,大佬大神什么的,看成一个称呼就好,若是真的觉得本身就是大神,那可能就走偏了。html

其实我很多方面都比较薄弱,好比redis、mysql、jvm这些c语言写的东西,不少书,我也看过屡次,看的那段时间,你可能懂了,也能够在面试的时候,侃侃而谈,可是,过一阵再问你,你可能部分细节已经记不住了。java

我如今本科毕业快7年,虽然这些年一直也在学,可是记忆这东西,好像是有些退化,记个东西,感受确实愈来愈容易忘;尤为,是这些平时光看不练的东西。mysql

因此,打算在实践中,来掌握这些东西。linux

好比,你说redis的字符串的底层实现,不少人可能都能答上来,是sds,可是只是看,只是记,这种简单的还好,复杂一点的,两个月确定忘。c++

因此,咱们就但愿,可以把redis的源码拉下来看,看的过程,你能够本身在源文件里加注释;同时,也要支持debug,来观察程序的运行过程,来看看,一个请求进来,是怎样编解码,怎么样被处理的,怎么样返回结果的,网络通讯怎么作的,这之类的。git

咱们选择的代码,是Redis畅销书,Redis设计与实现(第二版)里配套的代码,做者已经加了不少注释,咱们能够结合代码、书一块儿来学习,合适的状况下,咱们也要能写一个小demo,实践实践。程序员

因此,第一步的环境搭建尤其重要,并且,redis看懂了,相信之后看mysql,也不会问题特别大。固然,须要一些c语言基础,我也会在文章里讲一些,我本身也是半斤八两,边看边学呗,还能怎么样呢?面试

这个系列,估计会更新比较慢,由于个人c语言基础,也不是很好。redis

好了,咱们开始吧。spring

环境搭建的大致思路

windows下安装linux工具链

你们记得在linux上,怎么安装redis那些的吧,是否是有个configure,make,make install啥的,为啥java程序不须要这么弄呢?由于java有jvm,咱们的java文件是编译成class,在jvm上运行的,而c语言程序,是直接依赖于操做系统的,一样的c语言程序,好比你要实现网络功能,在windows上和在linux上,要调用的api,是不同的,总之呢,就是c语言程序,是严重依赖于底层的操做系统。

切回正题,在linux下咱们是用gcc来编译c语言程序的,好比,针对如下这个简单的helloWorld:

#include <stdio.h>

int main(void) {
    printf("hahha");
    return 0;

}

要像下面这样,用gcc编译为二进制,才能继续执行:

gcc、make这些都是linux下的工具,在windows下怎么办呢?这个不用担忧,早有人帮咱们弄好了,前辈们将这些linux下的工具,移植到了windows下,如今有两种主流方案,一种是MinGW,另外一种是cygwin。

咱们只须要安装这两种软件中的一种,就能够在windows下使用原本在linux下才能使用的工具了,上面那个图,就是我在windows下截的。

至于MinGW和cygwin的差异,你们自行去查询,由于我找了些答案,感受都有些冲突。咱们的需求比较简单,两种均可以知足,我这边选择了cygwin,建议你们和我这边保持一致。

cygwin呢,在安装过程当中,会让咱们选择要安装的工具,好比gcc、g++(c++时候使用)、make、cmake等,咱们能够按需选择。

什么是make和cmake

你们参考这个连接:CMake与Make最简单直接的区别

看完这个以后,我再简单说说,个人理解是,一个程序,在linux下运行,你要写一份makefile;若是要弄到其余平台,这个makefile就用不了了,要再写一份。

因此,为了跨平台,出现了cmake,cmake是让程序员用统一的语法来写cmake文件,而后cmake会帮助咱们生成对应的平台下的makefile。

果真是,没有什么是加一个中间层不能解决的。

对于java的同窗,可理解为:cmake就像jvm同样,帮助咱们跨平台。

cmake呢,也是经过前面的cygwin来安装的。

安装c语言开发的ide

这个呢,我咨询了两位朋友,作c的,而后他们都是用的visual studio,我一开始也是下载这个,可是比较大,我下载的visual studio 2012(应该是比较老的版本了),都要1.5g,下载花了就比较久,安装又是半个小时,而后装完还不怎么会用;

在上面的vs下载的过程当中,我在网上找了下,也有不少使用jetbrains公司出的 clion。这个呢,我目前就是用的这款,最大的好处是,它和idea、pycharm这些同样,同一个公司出的,因此,操做界面、操做习惯、包括快捷键,几乎都是差很少的,能够无缝切换。

一开始,我安装的是clion 2018.3 版本,而后遇到个问题,也不知道怎么解决,就又下了clion 2019.1版本,问题仍是没解决,最后换了clion 2019.3版本,问题仍是在,不过虽然问题一直在,但其实也无关大局,就忍一忍算了。

期间,visual studio 2012终于下载完了,装了半个小时多,发现用着仍是不太习惯,并且,好像不太支持导入cmake工程,干脆就卸了,结果,卸载又花了半天,由于它给个人电脑,装了近20个软件。。。我他么。。。

因此,最终我这边的ide是 clion 2019.3,下载连接:clion 2019.3 连接

具体安装步骤

cygwin安装

安装前,先下载,下载连接:cygwin官网,在这里,目前下载下来的版本,是3.1.4.1,为何要强调版本,由于clion,不一样的clion版本,支持的 cygwin版本不同,我看网上都没人提过。

clion为啥要依赖cygwin,由于clion只是个ide,具体的代码编译之类的,仍是要gcc、cmake这些来作的,我给你们看下,我一开始下载的2018.3版本,配置了个人cygwin以后,提示以下:

这也是为何后来,遇到问题我要升级版本的缘由,由于我总感受,有多是这里的问题,虽然升级了版本,问题也还在。

建议你们仍是和我版本保持一致。

  • cygwin:3.1.4.1
  • clion:2019.3

大概的安装步骤,能够看这个:

https://blog.csdn.net/testcs_dn/article/details/78866994

http://www.javashuo.com/article/p-fytnotkk-gr.html

注意的是,下面这个路径要记住,后面会用:

而后,在设置镜像网站时,我是用的阿里云:http://mirrors.aliyun.com/cygwin/

接下来,就是让咱们选择要安装的东西,网上通常给的就是以下几个:

gcc-core、gcc-g++、make、gdb、binutils ,我建议你们把vim也装上,方便操做。

而后就是等它安装完成,完成后,桌面上会有以下图标:

而后,双击打开,能够依次执行如下命令:

  • cygcheck -c cygwin ,查看安装的cygwin版本信息
  • gcc --version ,查看安装的gcc版本信息,这个是编译c的
  • g++ --version,查看安装的g++版本信息,这个是编译c++的
  • gdb --version,查看gdb版本信息,这个是debug用的,很是出名

若是都没啥问题的话,那基本就安装好了。

而后,你们还记得前面安装时,选择的路径吗?把那个路径的bin目录,加到path这个环境变量,而后咱们就能够在cmd里用上面那些命令了。

clion安装及插件安装

下载连接:clion 2019.3 连接

这个的安装,和idea的安装,没啥差异,不过你们不要选太多插件,不少毕竟用不上,按需选择吧。好比什么cvs、svn那些,装了干啥呢,对吧。

而后我本身直接用的试用30天,等到后续真须要破解再说。

安装过程当中,可能就会让你们配置tool chains,直接输入前面的cygwin的目录便可。

从上面能够看到,咱们这里,用的cmake,就是cygwin下的,gdb也是的。

而后,咱们能够再安装两个插件(Cmake Sinple highlighter 和 CMake Plus),以下:

其中一个要付费,不过能够先试用。

克隆redis 代码

地址:https://gitee.com/ckl111/redis-3.0-annotated-cmake-in-clion

这里感谢前辈博客:http://www.javashuo.com/article/p-qulmpshs-mw.html

我这里基于他的博客,对cmake 文件,作了少量的修改。

你们把代码克隆到本地后,而后在clion中,打开工程便可。

打开工程后,你们要注意上面的CMakeList.txt,其中,已经默认给咱们配置了几个target:

其中,库应该是不能独立运行的,咱们能够运行下面的三个,其中:

  • redis-cli,redis客户端
  • redis-server,服务端
  • redis-example,这个是我本身加的,主要是但愿:能够像在java中那样,启动一个main方法,去测试一些工具类啊或者啥的,否则的话,就得写到redis-server的代码中,而后用redis-cli去访问,去触发咱们的测试代码。主要是相似于一个测试用的入口。

redis-example,我还多说一点,仔细看CmakeList.txt,可能就理解了:

如何调试

拿redis-example举例:

不过这里的debug,有一点问题,就是会开一个单独的cmd窗口,而不是直接在Console中输出;printf也有点问题。

可是,使用run方式运行,则没有任何问题。

如何调试redis-server

方法和上面同样,其实你们更关心断点打在哪儿吧,能够打在下面这个地方:

redis.c文件的processCommand,这里我还加了一行注释给你们:

int processCommand(redisClient *c) {
    /* The QUIT command is handled separately. Normal command procs will
     * go through checking for replication and QUIT will cause trouble
     * when FORCE_REPLICATION is enabled and would be implemented in
     * a regular command proc. */
    // 特别处理 quit 命令
    void *commandName = c->argv[0]->ptr;
    redisLog(REDIS_NOTICE, "The server is now processing %s", commandName);

调试以下:

redis-cli,咱们能够就用工程给咱们生成的那个,版本是配套的:

能够看到,断点已经生效了,且,客户端的请求已经到达。

总结

万事开头难,但愿你们和我一块儿,开始此次的redis之旅。

相关文章
相关标签/搜索