1、gdb的简介
GDB全称"GNU symbolic debugger",它诞生于GNU计划(gcc也同样诞生于该计划),是Linux下常用的程序调试器,其通常以gdb命令的形式在终端中使用。
2、启用GDB调试
在使用GDB调试某个程序之前,需要对程序进行编译,并且需要在编译时加上编译选项 -g
,否则程序是不包含调试信息的。编译完成之后,可以输入命令:gdb xxx
(xxx为所要调试的程序名)。
3、常用命令
命令 | 效果 |
---|---|
quit/q | 退出GDB |
run/r | 运行程序,若程序需要输入参数,也在这输入参数 |
kill | 停止程序 |
break/b xxx | 在函数xxx入口处设置断点 |
break/b *0x400000 | 在地址0x400000处设置断点 |
delete/d 1 | 删除断点1 |
delete/d | 删除所有断点 |
stepi | 执行1条指令 |
stepi n | 执行n条指令 |
nexti | 类似stepi,但是以函数调用为单位 |
continue/c | 继续执行 |
finish | 运行到当前函数返回 |
disas | 反汇编当前函数 |
disas xxx | 反汇编函数xxx |
disas 0x400000 | 反汇编位于地址0x400000附近的函数 |
disas 0x400000,0x40050d | 反汇编位于0x400000~0x40054d范围内的函数 |
print/p $rax/0x100 | 以十进制输入%rax的内容/0x100 |
print/p /x $rax/0x100 | 以十六进制输出%rax的内容/0x100 |
print/p /t $rax/0x100 | 以二进制输出%rax的内容/0x100 |
info frame | 有关当前栈帧的信息 |
info registers | 显示所有寄存器的值 |
info break/b | 显示所有断点的信息 |
4、使用实例
本实例将使用gdb对下面代码进行调试:
#include <stdio.h>
long fact_do(long n)
{
long result = 1;
do{
result *= n;
n = n-1;
}while(n > 1);
return result;
}
int main()
{
long a = 5;
long result = fact_do(a);
return 0;
}
- 编译代码
gcc -g test01.c -o test01
- 启动gdb
gdb test01
- 添加断点
b fact_do //在fact_do函数入口处添加断点
- 运行程序
run
运行程序之后,函数会停止在函数fact_do的第一条命令
- 查看n变量的值
- 查看断点信息
- 删除断点
- 设置break条件
- 逐步执行
- 退出gdb,若还有断点未删除,会提示