C语言gdb调试详解

目录

一、gdb简介

二、gdb的安装

三、调试前的准备

四、基本调试命令

举个例子 

五、其他命令 


一、gdb简介

  • GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具
  • 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具

二、gdb的安装

CentOS系统中,用root用户登录服务器,执行以下命令安装或升级

yum -y install gdb
  1. 如果您的服务器没有安装gdb,以上命令就会安装最新版本的gdb,如果已经安装了gdb,就会更新到最新版本的gdb
  2. 安装gdb,前提条件是服务器必须接入互联网

三、调试前的准备

用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加 -g 的参数

例如:

 gcc -g -o 文件名 文件名.c

在命令提示符下输入gdb 加上你要调试的程序名就可以调试了

 gdb 文件名

四、基本调试命令

命令

命令缩写

命令说明

set args

  • 设置主程序的参数
  • 例如:./文件名  参数
  • 设置参数的方法是:
  • gdb 文件名
  • (gdb) set args 参数

break

b

  • 设置断点,b 20 表示在第20行设置断点,可以设置多个断点

run

r

  • 开始运行程序, 程序运行到断点的位置会停下来,如果没有遇到断点,程序一直运行下去

next

n

  • 执行当前行语句,如果该语句为函数调用不会进入函数内部执行

step

s

  • 执行当前行语句,如果该语句为函数调用,则进入函数执行其中的第一条语句
  • 如果函数是库函数或第三方提供的函数,用s也是进不去的,因为没有源代码,如果是您自定义的函数,只要有源码就可以进去

print

p

  • 显示变量值,假如我有一个变量name
  • 例如:p name表示显示变量name的值

continue

c

  • 继续程序的运行,直到遇到下一个断点

set var name=value

  • 设置变量的值,假设程序有两个变量:int i; char name[21];
  • set var i=10 把i的值设置为10;
  • set var name="小酋" 把name的值设置为"小酋"
  • 注意,不是strcpy

quit

q

退出gdb环境

举个例子 

#include <stdio.h>
#include <string.h>

int mystrcmp(const char *str1,const char *str2)
{
     int i = 0;
     int len = 0;//  str1 和 str2 较短的字符串长度

     if ( strlen(str1) > strlen(str2) )  len = strlen(str2);

     else len = strlen(str1);

     for (i = 0;i < len;i++) {
       if (str1[i]==str2[i]) continue;
       else break;
     }

     // 两个字符串相等
     if ( (i==len) && (strlen(str1)==strlen(str2))  ) return 0;

     // 两个字符串不相等
     else if (str1[i]>str2[i]) return 1;
     
     else return -1;
}    

int main()
{
    char name1[21];
    memset(name1,0,sizeof(0));
    strcpy(name1,",xiaoqiu");

    char name2[21];
    memset(name2,0,sizeof(0));
    strcpy(name2,"hello");

    printf("%d\n",mystrcmp(name1,name2));

    return 0;
}

调试以上程序

这里就进入到了 gdb 的调试界面了 

list(简写 l): 查看源程序代码,默认显示10行,按回车键继续往下看10行

  1. break(简写 b) :格式 b 行号,在某行设置断点
  2. info breakpoints :显示断点信息
  3. Num: 断点编号
  4. Disp:断点执行一次之后是否有效  (keep:有效 dis:无效)
  5. Enb: 当前断点是否有效  (y:有效 n:无效)
  6. Address:内存地址
  7. What:位置 

run (简写 r) :运行程序直到遇到结束或者遇到断点等待下一个命令 

使用 b r n p s 命令 

五、其他命令 

除了基本命令外,gdb 还有一些其他命令

  1. continue 简写 c :继续执行,到下一个断点处(或运行结束)
  2. until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体
  3. until+行号: 运行至某行,不仅仅用来跳出循环
  4. finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
  5. call 函数(参数):调用程序中可见的函数,并传递“参数”
  6. delete 断点号n:删除第n个断点
  7. disable 断点号n:暂停第n个断点
  8. enable 断点号n:开启第n个断点
  9. clear 行号n:清除第n行的断点
  10. info b (info breakpoints) :显示当前程序的断点设置情况
  11. delete breakpoints:清除所有断点
  12. list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
  13. list 函数名:将显示“函数名”所在函数的源代码,如:list main
  14. display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
  15. watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
  16. whatis :查询变量或函数
  17. info function: 查询函数
  18. info locals: 显示当前堆栈页的所有变量
  19. where/bt :当前运行的堆栈列表;
  20. bt backtrace :显示当前调用堆栈
  21. up/down :改变堆栈显示的深度
  22. show args:查看设置好的参数
  23. info program: 来查看程序的是否在运行,进程号,被暂停的原因
  24. layout:用于分割窗口,可以一边查看代码,一边调试
  25. layout src:显示源代码窗口
  26. layout asm:显示反汇编窗口
  27. layout regs:显示源代码/反汇编和CPU寄存器窗口
  28. layout split:显示源代码和反汇编窗口
  29. Ctrl + L:刷新窗口 

重点掌握基本命令就行,其他命令很多,可以自己去测试一下,了解一下即可,不用去死记硬背,看实际需求吧 ,命令这种东西用多了自然就熟悉了

猜你喜欢

转载自blog.csdn.net/XiaoQiu__/article/details/127538112