您的位置:

从入门到精通:Linux GDB调试命令

一、GDB命令简介

GDB是GNU Project Debugger的缩写,是一种功能强大的源代码调试器。它可以通过许多命令交互式地调试程序。下面介绍一些基本的GDB命令,并附上代码示例。

二、GDB命令使用

1. 设置断点

使用GDB调试程序的第一步通常是设置断点,以便在适当的位置暂停程序。可使用如下两个命令设置断点:

b  // 设置断点
r  // 运行程序

示例代码:

#include 
int main(){
  int a=1,b=2,c;
  c=a+b;
  printf("c=%d\n",c);
  return 0;
}

  

使用上述代码进行调试时,执行b命令后输入参数main,执行r命令运行程序,当程序遇到breakpoint后停止执行。可以使用info命令查看断点信息,使用delete命令删除断点。

2. 查看程序状态

通过使用GDB,我们可以查看正在运行程序的状态,以便了解程序运行时发生了什么。下面是一些常用的命令:

  • info 命令:查看程序的状态
  • print 命令:查看变量的值
  • backtrace命令:查看函数调用链

示例代码:

#include 
int main(){
  int a=1,b=2,c;
  c=a+b;
  printf("c=%d\n",c);
  return 0;
}

  

使用上述代码进行调试时,执行r命令后可以使用print a命令查看变量a的值,可以使用info命令查看程序状态,使用backtrace命令查看函数调用链。

3. 进行单步调试

单步调试是GDB的一项基本功能。它允许你一次一条地执行代码并在执行途中检查状态。下面是一些可以使用的命令:

  • step 命令:执行当前行,并进入函数、循环或条件语句
  • next 命令:执行当前行,但是不进入函数、循环或条件语句
  • finish命令:执行当前函数并返回调用它的函数

示例代码:

#include 
int sub(int a,int b){
    int c;
    c=a-b;
    return c;
}
int main(){
  int a=1,b=2,c;
  c=sub(a,b);
  printf("c=%d\n",c);
  return 0;
}

  

当使用上述代码进行调试时,使用step命令可以进入函数sub,使用next命令可以退出函数,使用finish可以将程序运行到函数结尾处。

三、其他GDB命令

1. 调试崩溃程序

当程序发生崩溃时,调试起来会更加困难。但是,GDB可以帮助你确定问题发生的地方。我们可以使用如下命令来帮助我们进行调试:

  • bt命令:查看函数调用链,帮助确定在哪个函数中发生了崩溃
  • info registers 命令:查看寄存器中的值,帮助了解程序的状态
  • x/10i $eip命令:查看程序中指令的汇编语言代码

示例代码:

#include 
int main(){
  int *p=NULL;
  *p=0;
  return 0;
}

  

当使用上述代码进行调试时,使用run命令启动程序,在程序崩溃后使用bt命令可以查看函数调用链,使用info registers命令可以查看寄存器的值,使用x/10i $eip可以查看崩溃时程序中的指令。

2. 跟踪变量值

GDB可以设置条件断点,以便在变量值发生变化时暂停程序。下面是一个示例程序及其演示:

#include 
int main(){
  int a=0,b=0,c=0;
  while(1){
      a++;
      if(a>5){
        b++;
        if(b>3){
          c++;
        }
      }
      printf("a=%d,b=%d,c=%d\n",a,b,c);
  }
}

  

使用如下代码可以设置条件断点:

b main.c:9 if a==5

这会在变量a的值等于5的时候停止程序,然后可以通过使用print命令来查看变量的值。

3. 模拟输入

使用GDB,我们可以模拟输入以便测试一些特定的情况。下面是一个示例程序及其演示:

#include 
int main(){
  int a;
  printf("Please input your age:");
  scanf("%d",&a);
  if(a<18){
    printf("You are under 18.\n");
  }
  else{
    printf("You are over 18.\n");
  }
  return 0;
}

  

使用如下代码可以使用GDB模拟输入:

set args < input.txt
run

以上代码会将文件input.txt中的内容读入程序中,并将其作为输入。

四、总结

GDB是一个非常强大的源代码调试器,它提供了许多功能帮助程序员定位代码错误。有了GDB的帮助,调试程序变得更加简单,并且大大提高了调试效率。