Linux开发工具——gdb篇

Linux下调试工具——gdb


文章目录

makefile自动化构建工具

    gdb背景

    gdb的使用

      常用命令

    总结

前言:

  编写代码我们使用vim,编译代码我们使用gcc/g++,但是我们,不能保证代码没问题,所以调试是必不可少的。与gcc/vim一样,Linux下的调试功能也是独立的一个工具——gdb 那么我们话不多说,开启今天的话题!

Linux开发工具——gdb篇_第1张图片


✈️ gdb背景

  •  我们知道,程序的发布方式有两种:dubug模式release模式
  •  Linux gcc/g++编译出来的 二进制程序默认是release模式
  •  要使用gdb调试工具,必须在源代码上生成二进制程序的时候,加上 -g 选项。

  为了能够控制在源码生成二进制程序的时候加上-g选项,我们可以在makefile文件中进行操作:

Linux开发工具——gdb篇_第2张图片
  我们在windows写代码时,调试工具大家多多少少也都用过,但是为什么还分为debug版本和release版本呢?或者说他们的区别是什么?

区别就是,在debug模式下形成的可执行程序会给我们添加调试信息。在release模式下形成的可执行程序会给我们去掉调试信息
结论release模式下的程序体积更小,性能更好,debug模式下可以进行调试,release模式下不能调试

  一般我们应用是面向广大用户的,用户只是需要使用应用即可,总不能让他们用调试工具来调试吧。所以一般我们给用户的发布版本就是release版本。

  所以默认情况下,gdb是以release版本发布的,那么我们如何让gdb以debug版本发布呢?使用 readelf命令 可以读取可执行程序的格式

Linux开发工具——gdb篇_第3张图片
  可以看到,debug的调试信息就出来了,我们再将makefile中目标文件的-d删除:

Linux开发工具——gdb篇_第4张图片


✈️ gdb的使用


  通过前面的学习,我们已经知道了gcc/g++的 默认行为

  • 默认是动态链接
  • 默认是release版本发布

  我们将makefile文件更改之后,再次使用make命令所生成的可执行程序就是 带有调试信息的可执行程序,这个时候就可以对程序进行调试了。

  调试方法:

gdb 带有调试信息的可执行程序#进入调试页面

  如果你的Linux下没有gdb调试工具可以用以下指令安装对应的调试工具:

yum -y install gdb#安装gdb调试工具

  为了能够更好地理解gdb调试工具,我们可以结合着windows下的vs的调试来进行比较。


开始使用

  我们有了带调试信息的可执行程序之后,使用 gdb mybin,进入到调试页面:

Linux开发工具——gdb篇_第5张图片

  当我们看到这样的页面,就说明你已经开始调试了,下面我来一一介绍在gdb中对应指令的功能。我们先准备一个.c的源文件:

Linux开发工具——gdb篇_第6张图片


  • list(或l)命令

作用: 显示指定行之后的代码(gdb自动记录最近一条指令),每次列10行。
用法: l 行号l 函数名

测试用例:

Linux开发工具——gdb篇_第7张图片

  为什么使用list 3不是从第三行开始的?这是因为gdb的list行为是 将要显示的行放在比较靠中间的位置,而不是从所输入的行开始显示。


  • run(或r)命令

作用: 运行程序。

用法: 直接输入r再回车即可。

测试用例:

Linux开发工具——gdb篇_第8张图片


  我们在vs下,打断点只需要在左侧边框按一下鼠标左键,取消也仅仅只需要按一下鼠标左键:

Linux开发工具——gdb篇_第9张图片
  而我们Linux的gdb只有使用对应的指令才能打断点。

  • breakpoint(或b)命令

作用: 在某一行或者某个函数设置断点。

用法: b 行号b 函数名b 文件名:行号

  • info 命令

作用: 查看断点信息。

用法: info b

测试用例:

Linux开发工具——gdb篇_第10张图片

  • d命令

作用: 删除断点。

用法: d 断点编号

测试用例:

Linux开发工具——gdb篇_第11张图片
  断点删除 不能根据行号来删除只能根据断点编号来删除


  在vs中,我们也可以禁用断点:

Linux开发工具——gdb篇_第12张图片
  禁用断点之后,调试就不会从这里停下来了,在gdb中,我们也有禁用断点的指令。

  • disable/enable命令

作用: 使能(禁用/开启)断点。

用法: disable/enable 断点编号

测试用例:

Linux开发工具——gdb篇_第13张图片

  断点禁用之后运行是不会从被禁止断点处停下的。

  如果运行时经过断点,那么在info b的时候,就会显示命中次数

Linux开发工具——gdb篇_第14张图片


  在vs中,我们有单步调试逐语句和逐过程的快捷键:

Linux开发工具——gdb篇_第15张图片
  那么在Linux下gdb调试工具的单步调试就是:

  • next(或n)命令

作用: 逐过程进行单步调试

用法: 程序在运行时直接输入n回车即可。

测试用例:

Linux开发工具——gdb篇_第16张图片

  • step(或s)命令

作用: 逐语句进行单步调试。

用法: 程序在运行时直接输入s回车即可。

测试用例:

Linux开发工具——gdb篇_第17张图片


  在vs中,我们可以在调试里的监视窗口对变量的内容或者地址进行显示。

Linux开发工具——gdb篇_第18张图片

  而在Linux下的gdb中,我们使用如下命令来显示变量内容和地址。

  • p命令

作用: 显示变量的内容和地址

用法: p 变量名

测试用例:

Linux开发工具——gdb篇_第19张图片

  • display/undisplay命令

作用: 常显示 变量的内容和地址。

用法: display 变量名/取地址undisplay 编号

测试用例:

Linux开发工具——gdb篇_第20张图片


  • continue(或c)命令

作用: 从一个断点运行到下一个断点。

用法: 程序运行时直接输入c回车,从这个断点运行到下个断点。

测试用例:

Linux开发工具——gdb篇_第21张图片


  • finish命令

作用: 将一个函数运行结束,就停下来。

用法: 程序运行时直接使用finish命令即可。

测试用例:

Linux开发工具——gdb篇_第22张图片


  • until命令

作用: 在一个范围内直接运行到指定行。

用法: until 行号

测试用例:

Linux开发工具——gdb篇_第23张图片


  在vs下,我们要想修改变量的值,需要打开源文件,再进行修改,修改完之后再调试,而在Linux下的gdb工具,可以实现 不用退出调试更改变量,使用set var命令即可。

  • set var命令

作用: 修改一个变量的内容。

用法: set var 变量名=修改的值

测试用例:

Linux开发工具——gdb篇_第24张图片


  • bt命令

作用: 查看调用堆栈信息。

用法: 直接输入bt回车。

测试用例:

Linux开发工具——gdb篇_第25张图片

  以上就是gdb调试的一些常用指令操作了,如果要退出gdb模式只需要 输入q再回车 即可退出gdb模式


✈️ 总结

  • 想要进行调试,需要再makefile文件里生成目标文件时加上-g选项,生成的可执行程序可以使用readelf指令查看是否具有调试信息。
  • 操作理念是具有迁移性的,在windows的os下,我们使用vs进行调试,只不过在Linux下使用命令行的形式来进行调试,但是调试都是一样的。
  • 常用调试指令不用记,只要多使用使用,这些都会接触到。

Linux开发工具——gdb篇_第26张图片

  如果这篇文章对你有帮助的话,还望三连支持一下博主~~

你可能感兴趣的:(Linux学习,linux,服务器,gdb调试工具)