源码都没调试过,怎么能说熟悉 redis 呢?
一:背景
1. 講故事
記得在很久之前給初學的朋友們錄制 redis 視頻課程,當時結合了不少源碼進行解讀,自以為講的還算可以,但還是有一個非常核心的點沒被分享到,那就是源碼級調試, 對,讀源碼還遠遠不夠,還得親自實操,為了彌補這個遺憾,這一篇就補起來哈。
二:vscode 和 redis 的部署
1. 平臺和調試工具
大家都知道 官方版redis 是不支持 windows 的,即使被微軟開源技術社區移植到了 windows 平臺,版本滯后就不說了,無數潛在的 bug 可能會讓你望而卻步,gitbub地址:https://github.com/microsoftarchive/redis ? 目前最新的版本是 3.0.5, 官方都已經是 6.0.9 啦!????
扯這么多的意思就是想說不要指望用 windows + visualstudio 調試源碼,更何況這里還要調試最新版的 redis6, 只能上 centos + vscode 了哈 ????????????
2. vscode 在 centos 上的安裝
官方地址下載 vscode,這里我用的版本是 1.23,參考網址:https://code.visualstudio.com/updates/v1_23
安裝 vscode 的依賴包 libXScrnSaver, nss
rpm 安裝 vscode
安裝完后就可以在 centos 上找到 vscode 的啟動圖標了,?????????????。
3. redis6 源碼下載
這里有一個坑要提醒一下,如果你編譯 redis6 的話,centos7 的 gcc 默認是 4.8.5,你需要升級一下:
[root@localhost?redis-6.0.9]#?gcc?-v gcc?version?4.8.5?20150623?(Red?Hat?4.8.5-39)?(GCC)? [root@localhost?~]#?yum?-y?install?centos-release-scl [root@localhost?~]#?yum?-y?install?devtoolset-9-gcc?devtoolset-9-gcc-c++?devtoolset-9-binutils [root@localhost?~]#?source?/opt/rh/devtoolset-9/enable [root@localhost?redis-6.0.9]#?gcc?-v gcc?version?9.3.1?20200408?(Red?Hat?9.3.1-2)?(GCC)然后就可以源碼下載,編譯,啟動,直接參考官方文檔來: ?https://redis.io/download
$?wget?https://download.redis.io/releases/redis-6.0.9.tar.gz $?tar?xzf?redis-6.0.9.tar.gz $?cd?redis-6.0.9 $?make $?src/redis-server沒什么好說的,執行完后的啟動界面如下:
三:vscode 調試 redis
1. 使用 vscode 安裝 c/c++ 擴展
具體用法和 windows 上的 vscode 差不多,該怎么裝還怎么裝。
2. 使用 debug 生成 launch.json 啟動文件
菜單欄 "Debug" -> "Starting Debug",然后選擇 "C++ (GDB/LLDB)",如下圖:
再配置一下啟動文件 .vscode/launch.json,將 ${workspaceFolder}/src/redis-server 程序的路徑配置在 program 節點下,如下代碼所示:
{//?Use?IntelliSense?to?learn?about?possible?attributes.//?Hover?to?view?descriptions?of?existing?attributes.//?For?more?information,?visit:?https://go.microsoft.com/fwlink/?linkid=830387"version":?"0.2.0","configurations":?[{"name":?"(gdb)?Launch","type":?"cppdbg","request":?"launch","program":?"${workspaceFolder}/src/redis-server","args":?[],"stopAtEntry":?false,"cwd":?"${workspaceFolder}","environment":?[],"externalConsole":?true,"MIMode":?"gdb","setupCommands":?[{"description":?"Enable?pretty-printing?for?gdb","text":?"-enable-pretty-printing","ignoreFailures":?true}]}] }3. 生成編譯指令文件 tasks.json
在 .vscode 目錄下新建 tasks.json,使用 make 命令編譯 redis 源碼,最后由 launch.json 讀取生成好的 可執行文件 redis-server,代碼如下:
{"version":?"2.0.0","tasks":?[{"label":?"Build","type":?"shell","command":?"make","args":?["CFLAGS=\"-g?-O0\""]}] }4. 調試執行
在 server.c 中找到 main 啟動函數,下一個斷點過去,按 F5 執行,如下圖可以看到斷點已命中。
為了更加逼真一點,我在 string.c 中的 setCommand 處設置斷點,保證 redis-cli 在執行 set username jack 時斷點命中。
client 端
server 端
怎么樣,圖中左側面板中的 局部變量窗口,監控窗口,調用堆棧窗口,一目了然。。。
四:總結
總的來說,整個搭建過程有一定的繁瑣度,但學啥又簡單呢?再說源碼都沒調試過,怎么能說熟悉 redis 呢?最后祝大家有一個開心的 redis 調試之旅!
總結
以上是生活随笔為你收集整理的源码都没调试过,怎么能说熟悉 redis 呢?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IdentityServer4系列 |
- 下一篇: 你想象中的Task后续,很简单?