一般来说GDB主要调试的是c/c++程序,首先在编译时,我们必须把调试信息添加到可执行文件中。使用编译器(cc/gcc/g++)的-g
参数可以做到这一点。如:
1 | cc -g tst.c -o tst |
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你使用-g
成功编译目标代码以后,我们就可以使用gdb
来调试程序。
启动GDB
1 | program 也就是你的执行文件,一般在当前目录下 |
指令
列出原码
1 | list [行号] |
直接会车表示重复上一次命令
设置断点在行号处
1 | break [行号] |
在函数入口处加断点
1 | break [函数名] |
查看断点信息
1 | info break |
断点跟踪
命令 | 功能 |
---|---|
r | 运行程序,run命令简写 |
n | 单条语句执行,next命令简写 |
c | 继续运行程序,continue命令简写。 |
p i | 打印变量i的值,p是print命令简写。 |
bt | 查看函数堆栈 |
finish | 退出函数 |
q | 退出gdb |
调用系统命令
shell <command string>
调用UNIX的shell来执行 <command string>
,环境变量SHELL
中定义的UNIX的shell
将会被用来执行<command string>
,如果SHELL没有定义,那就使用UNIX的标准shell
:/bin/sh
。(在Windows中使用Command.com
或cmd.exe
)
重新构建
还有一个gdb
命令是make
,可以在gdb中执行make命令来重新build自己的程序
1 | make <make-args> |
这个命令等价于
1 | shell make <make-args> |
参考资料
http://www.gnu.org/software/gdb/documentation/