文先生的博客 求职,坐标深圳。(wenfh2020@126.com)

用 gdb 调试 redis

2020-01-05

可以通过 gdb / vscode 调试 redis 源码,理解 redis 工作流程。


1. 安装编译 redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 下载 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

# 更新 makefile 下面对应的编译项内容。
# --------------------
# OPTIMIZATION?=-O2
OPTIMIZATION?=-O0
# REDIS_LD=$(QUIET_LINK)$(CC) $(FINAL_LDFLAGS)
REDIS_LD=$(QUIET_LINK)$(CC) $(FINAL_LDFLAGS) $(OPTIMIZATION)
# --------------------

# 编译源码。
make clean; make

2. gdb 常用命令

详细文档通过命令 man gdb 查看。

命令 操作
r 运行调试。
n 下一步。
c 继续运行。
ctrl + c 中断信号。
c/continue 中断后继续运行
s 进入一个函数。
finish 退出函数。
l 列出代码行。
b 断点
显示断点列表 info b
删除断点 delete <number>
清除断点 clear
until 跳至行号。
until <number>
p 打印
打印数组信息 p *array@len
p/x 按十六进制格式显示变量
bt/backtrace 堆栈 bt <-n>
-n 表示一个负整数,表示只打印栈底下n层的栈信息。
f/frame 进入指定堆栈层。
f <number>
focus 显示源码界面。

参考:GDB 使用


3. 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 单步调试。

命令窗口调试

源码窗口调试


4. vscode 调试流程

4.1. 启动 vscode

因为 gdb 在 macOS 下需要 sudo 提升权限,vscode 配置貌似没有这个选项设置,所以只能用下面这个命令启动 vscode 项目。

1
2
3
4
5
# redis 源码本地目录
cd ~/src/other/redis-3.2.8

#  vscode 打开 redis 源码目录
sudo code --user-data-dir="~/.vscode-root" .

4.2. vscode 项目配置

  • launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
    "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
1
2
3
4
5
6
7
8
9
10
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "shell",
            "type": "shell",
            "command": "/usr/bin/make"
        }
    ]
}

4.3. vscode 调试

  • 调试效果。

调试


5. 参考


作者公众号
微信公众号,干货持续更新~