因?yàn)槲冶救酥饕菍?xiě)Java的,有強(qiáng)烈的IDE依賴癥,不喜歡使用文本編輯器或者命令行這樣的工具,所以選擇使用CLion搭建一個(gè)IDE環(huán)境來(lái)輔助閱讀。但是CLion主要支持的是CMake管理的項(xiàng)目,而Redis是用普通的Makefile管理的,所以需要一些技巧來(lái)配置環(huán)境。
支持跳轉(zhuǎn)
CLion從2018.2版本開(kāi)始支持通過(guò)compiledb來(lái)讓Makefile的項(xiàng)目支持跳轉(zhuǎn)重構(gòu)等高級(jí)功能。
首先安裝compiledb:
pip install compiledb
務(wù)必在用CLion打開(kāi)Redis項(xiàng)目之前進(jìn)入Redis根目錄,運(yùn)行下面的命令:
compiledb -nf make
之后會(huì)在項(xiàng)目根目錄下生成一個(gè)compile_commands.json文件。
之后再用CLion打開(kāi)Redis項(xiàng)目,這樣CLion就會(huì)自動(dòng)檢測(cè)到compile_commands.json,就可以讀Redis源碼時(shí)進(jìn)行各種跳轉(zhuǎn)了。
調(diào)試Redis
完成上面的步驟后,依舊只能把CLion當(dāng)個(gè)閱讀器來(lái)讀代碼,無(wú)法單步調(diào)試的話還是不方便理解源碼。
經(jīng)過(guò)一番研究,發(fā)現(xiàn)可以使用CLion的"GDB Remote Debug"的功能對(duì)Redis的二進(jìn)制結(jié)合源碼進(jìn)行調(diào)試。
首先,要編譯出一個(gè)專門(mén)用于debug的二進(jìn)制,make默認(rèn)采用的編譯優(yōu)化級(jí)別的是-O2,代碼優(yōu)化會(huì)影響我們調(diào)試,所以我們編譯一個(gè)沒(méi)有優(yōu)化的版本便于調(diào)試:
make noopt
之后使用gdbserver來(lái)執(zhí)行該二進(jìn)制(如果還有安裝的話,就先安裝gdbserver):
gdbserver :43211 ./src/redis-server
上面命令表示在43211端口啟動(dòng)一個(gè)gdbserver,用于調(diào)試二進(jìn)制./src/redis-server。
之后在CLion上進(jìn)行配置Run -> Edit Configurations:

打好斷點(diǎn),點(diǎn)擊右上角的小蟲(chóng)子,就可以開(kāi)心地調(diào)試Redis了。
調(diào)試的截圖如下:

目前發(fā)現(xiàn)該調(diào)試方法的一個(gè)問(wèn)題就是當(dāng)gdbserver退出后,它所啟動(dòng)的二進(jìn)制進(jìn)程依舊不會(huì)退出,需要手動(dòng)kill一下,以免占用端口影響下次debug:
$ ps -ef | grep ./src/redis
dqyuan 11842 1 0 21:40 pts/5 00:00:00 ./src/redis-server *:6379
dqyuan 12266 26302 0 21:43 pts/2 00:00:00 grep --color=auto ./src/redis
$ kill -9 11842
參考文章
- redisbook.com
- CLion實(shí)現(xiàn)遠(yuǎn)程調(diào)試
- CLion開(kāi)發(fā)編譯調(diào)試Makefile項(xiàng)目
- Redis debugging guide
End
作者:元青
微信公眾號(hào) 「技樂(lè)書(shū)香」