如何使用gdb进行调试和执行各种基本指令?
摘要:1、gdb的简介 	GDB全称"GNU symbolic debugger",它诞生于GNU计划(gcc也同样诞生于该计划),是Linux下常用的程序调试器,其通常以gd
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,若还有断点未删除,会提示
