欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > Linux下的调试器 —— gdb

Linux下的调试器 —— gdb

2025/2/11 23:20:27 来源:https://blog.csdn.net/D5486789_/article/details/145525331  浏览:    关键词:Linux下的调试器 —— gdb

1.两种编译模式

众所周知,程序的编译有两种模式 —— debug模式和release模式。

  • debug模式:编译生成的可执行程序中添加调试信息。
  • release模式:编译生成的可执行程序中不会添加调试信息。

你肯定就要问了,为什么要有这两种模式呢?这是因为不同的人群需求不同。如果你是一个开发人员,你肯定希望你的可执行程序中包含调试信息,方便日后代码的维护;如果你是一个用户,你肯定不希望可执行程序中包含调试信息,因为用户往往希望更快的下载,并且下载的程序占用更少的空间。

gcc默认是进行动态链接并且以release版本编译程序的,如果我们想要以debug版本编译程序,需要带上 -g 选项:

  • 可以看到debug版本的可执行程序确实比 release 版本的可执行程序更大,这就是因为其内部添加了调试信息。

2.gdb

认识gdb

gdb是Linux系统给我们内置的一款调试工具,我们直接就能使用,使用gdb调试的可执行程序必须包含调试信息,也就是说gdb只能调试debug版本编译生成的可执行文件。

使用gdb调试可执行文件的命令为:gdb 可执行文件名

我们使用gdb调试release版本的可执行程序:

  • gdb会提示我们没有调试信息,也就无法进行调试。

我们使用gdb调试debug版本的可执行程序:

  • debug版本的可执行程序包含了调试信息,我们可以进行调试了。

如果我们不想进行调试了,直接输入 quit 就可以退出了。

gdb常用的调试操作

 接下来我们就可以愉快的进行调试了,我们以冒泡排序为例,code.c中的内容如下:

  1 #include <stdio.h>2 3 void swap(int* p1, int *p2)4 {5         int t = *p1;6         *p1 = *p2;7         *p2 = t;8 }9 10 void BubbleSort(int* a, int n)11 {12         for (int j = 0; j < n; j++)  //枚举结束位置和最后一个元素位置的差值 13         {14                 int flag = 0;15                 for (int i = 1; i < n-j; i++) //依次枚举相邻的两个元素 16                 {17                         if (a[i - 1] > a[i])18                         {19                                 swap(&a[i - 1], &a[i]);20                                 flag = 1;21                         }22                 }23 24                 if (flag == 0)25                 {26                         break;27                 }28         }29 }30 31 32 int main()33 {34         int nums[] = {5,4,2,6,3,1,8,9,7};35 36         BubbleSort(nums, 10);37 38         int i = 0;39         while(i < sizeof(nums)/sizeof(int))40         {41                 printf("%d ",nums[i]);42                 i++;43         }44 45         printf("\n");46 47         return 0;48 }

查看源码

如果我们想要查看源代码,我们可以使用 l + 行号 的方式查看指定行后面的内容,默认显示10行:

断点相关操作

在调试代码的时候,我们少不了打断点,在gdb中有三种打断点的方式:

  • b 行号
  • b 函数名
  • b 文件名:行号

我们可以使用 info b 命令查看设置的断点信息:

  • Num表示断点编号
  • Type表示类型,breakpoint表明这是一个断点
  • Enb表示该断点是否生效,y表示有效,n表示无效
  • What表示该断点所在的位置 

如果我们想要删除断点,我们可以使用 d 断点编号 来删除一个断点,我们删除编号为1的断点:

如果我们想要禁用一个断点,我们可以使用 disable 断点编号 命令:

  • 可以看到2号断点的使能功能 从y变成了n。

如果我们想要启用一个断点,我们可以使用 enable 断点编号 命令:

  • 可以看到2号断点的使能功能 从n变成了y。

逐过程和逐语句调试

调试的时候必须将程序运行起来,我们可以使用run命令将可执行程序运行起来:

如果我们想要进行逐过程调试,我们可以使用n命令,n是next的意思:

如果我们想要进入一个函数内部,也就是逐语句调试,我们可以使用s命令:

查看变量内容

如果想要查看某个变量的内容,我们可以使用 p 变量名 命令:

如果想要在调试的时候一直都能看到某个变量的信息,我们可以使用 display 变量名 命令来进行常显示:

如果我们想要取消某个常显示的内容,我们可以使用 undisplay 编号 取消常显示的变量:

其他调试操作

c:从一个断点运行到下一个断点。

finish:将一个函数运行结束就停下来。

until 行号:在一个范围内,直接运行到指定行。

set var 变量名=value:修改一个变量的内容。(可以在不修改代码的情况下进行多分支的测试)

bt:查看调用堆栈

  • 可以看到先调用main函数,在main函数中调用了BubbleSort函数,在BubbleSort函数中又调用了swap函数。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com