搭建Debug环境
wget https://github.com/antirez/redis/archive/3.2.13.tar.gz
tar -zxvf 3.2.13.tar.gz
mv redis-3.2.13 /opt/
cd redis-3.2.13
make
Debug初体验
# 在 redis 安装目录,进入 gdb 调试环境
gdb src/redis-server
# gdb 添加断点
(gdb) b main
Breakpoint 1 at 0x42ed05: file server.c, line 3962.
###启动服务
(gdb) r ./redis.conf
Starting program: /opt/redis-3.2.13/src/redis-server ./redis.conf
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main (argc=2, argv=0x7fffffffe5a8) at server.c:3962
3962 int main(int argc, char **argv) {
###能展示断点所在的代码 === 这个真是太牛逼了
(gdb) layout src
gdb调试常用命令
命令 | 描述 | demo |
---|---|---|
gdb file | 加载被调试的可执行程序文件 | gdb src/redis-serve |
r | Run 的缩写,运行被调试的程序。 | r ./redis.conf |
c | Continue 的缩写。继续执行被调试程序,直至下一个断点或程序结束 | c |
b | Breakpoint 缩写。设置断点。可以使用 行号、函数名称、执行地址等方式指定断点位置 | r ./redis.conf |
s/n | s 相当于“单步跟踪并进入”,也就是说进入到执行的函数内部。n 相当于“单步跟踪”,不进入到执行函数内部 | |
p 变量名称 | Print 缩写。显示指定变量的值。 | p server |
fin | finish缩写,func函数会继续执行完,并打印返回值 | |
return | return命令,这样函数不会继续执行下面的命令,而是直接返回到之前的地方 |
gdb添加断点
普通断点
根据代码行数设置断点是最常见的一种方式,在debug程序运行前就可以进行断点的配置。如:
(gdb) b src/main.cpp:127
函数断点
这种断点是当程序执行到某个程序时就会触发断点。设置方式如:
(gdb) b funcName