可以通過 gdb / vscode 調試 redis 源碼,理解 redis 工作流程。
視頻
- bilibili (Debug Redis in VsCode with Gdb)
- youtube (Debug Redis in VsCode with Gdb )
- 對應操作文檔: github
gdb 常用命令
詳細文檔通過命令查看:
man gdb
命令 | 操作 |
---|---|
r | 運行調試 |
n | 下一步 |
c | 繼續運行 |
ctrl + c | 中斷信號 |
c/continue | 中斷後繼續運行 |
s | 進入一個函數 |
finish | 退出函數 |
l | 列出代碼行 |
b | 斷點 顯示斷點列表 info b 刪除斷點 delete number 清除斷點 clear |
n | 下一步 |
until | 跳至行號 until |
p | 打印 打印數組信息 p *array@len p/x 按十六進制格式顯示變量 |
bt/backtrace | 堆棧bt <-n> -n表一個負整數,表示只打印棧底下n層的棧信息。 |
f/frame | 進入指定堆棧層 f |
thread apply all bt | 顯示線程所有堆棧 |
attach | 綁定進程調試 attach <-p pid> |
detach | 取消綁定調試進程 |
disassemble | 看二進制數據 disassemble |
x | 查看內存 |
focus | 顯示源碼界面 |
display | 顯示變量 |
info registers | 查看寄存器 |
安裝編譯 redis
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar xzf redis-3.2.8.tar.gz
cd redis-3.2.8
更新 Makefile,修改相應編譯項
vim src/Makefile
# OPTIMIZATION?=-O2
OPTIMIZATION?=-O0
# REDIS_LD=$(QUIET_LINK)$(CC) $(FINAL_LDFLAGS)
REDIS_LD=$(QUIET_LINK)$(CC) $(FINAL_LDFLAGS) $(OPTIMIZATION)
make clean; make
gdb 調試流程
步驟 | 命令 | 描述 |
---|---|---|
1 | sudo gdb --args ./src/redis-server redis.conf | 啓動調試 |
2 | r | 運行程序 |
3 | ctrl + c(鍵盤操作) | 中斷程序 |
4 | b dict.c:dictAdd | 對應代碼下斷點 |
5 | c | 繼續運行程序 |
6 | redis-cli set k5 v5 |
啓動 client 連接redis-server測試(redis 默認端口 6379) |
7 | focus | 進入源碼窗口調試 |
8 | bt | 程序堆棧(查看接口調用流程) |
9 | f 0 | 進入堆棧第 0 層 |
10 | n | 單步調試 |
vscode 調試流程
啓動 vscode
因爲 gdb 在 macOS 下需要 sudo 提升權限,vscode 配置貌似沒有這個選項設置。所以只能用下面這個命令啓動 vscode 項目
# redis 源碼本地目錄
cd ~/src/other/redis-3.2.8
# vscode 打開 redis 源碼目錄
sudo code --user-data-dir="~/.vscode-root" .
vscode 項目配置
- launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "gcc build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/src/redis-server",
"args": [
"redis.conf"
],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "shell"
}
]
}
- tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "shell",
"type": "shell",
"command": "/usr/bin/make"
}
]
}