曹工說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之旅。

相關文章
相關標籤/搜索