redis debug環境搭建過程詳解(使用clion)

概要

最近寫瞭spring系列,這個系列還在進行中,然後有些同學開始叫我大神,然後以為我各方面都比較厲害,當然瞭,我是有自知之明的,大佬大神什麼的,當作一個稱呼就好,如果真的以為自己就是大神,那可能就走偏瞭。

其實我不少方面都比較薄弱,比如redis、mysql、jvm這些c語言寫的東西,很多書,我也看過多次,看的那段時間,你可能懂瞭,也可以在面試的時候,侃侃而談,但是,過一陣再問你,你可能部分細節已經記不住瞭。

我現在本科畢業快7年,雖然這些年一直也在學,但是記憶這東西,好像是有些退化,記個東西,感覺確實越來越容易忘;尤其,是這些平時光看不練的東西。

所以,打算在實踐中,來掌握這些東西。

比如,你說redis的字符串的底層實現,很多人可能都能答上來,是sds,但是隻是看,隻是記,這種簡單的還好,復雜一點的,兩個月肯定忘。

所以,我們就希望,能夠把redis的源碼拉下來看,看的過程,你可以自己在源文件裡加註釋;同時,也要支持debug,來觀察程序的運行過程,來看看,一個請求進來,是怎樣編解碼,怎麼樣被處理的,怎麼樣返回結果的,網絡通信怎麼做的,這之類的。

我們選擇的代碼,是Redis暢銷書,Redis設計與實現(第二版)裡配套的代碼,作者已經加瞭很多註釋,我們可以結合代碼、書一起來學習,合適的情況下,我們也要能寫一個小demo,實踐實踐。

所以,第一步的環境搭建尤為重要,而且,redis看懂瞭,相信以後看mysql,也不會問題特別大。當然,需要一些c語言基礎,我也會在文章裡講一些,我自己也是半斤八兩,邊看邊學唄,還能怎麼樣呢?

這個系列,估計會更新比較慢,因為我的c語言基礎,也不是很好。

好瞭,我們開始吧。

環境搭建的大體思路

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 鏈接

Clion2020.2.x最新激活碼破解版附安裝教程(Mac Linux Windows)

具體安裝步驟

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://www.jb51.net/article/187586.htm

https://www.jb51.net/article/193502.htm

註意的是,下面這個路徑要記住,後面會用:

然後,在設置鏡像網站時,我是用的阿裡雲: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

這裡感謝前輩博客:https://www.jb51.net/article/218312.htm

我這裡基於他的博客,對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 debug環境搭建過程詳解(使用clion)的文章就介紹到這瞭,更多相關redis clion debug環境搭建內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: