【Linux】调试器gdb的使用


前言

  • 程序的发布方式有两种,debug模式和release模式
  • Linux下使用gcc或g++编译器编译后得到的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候加上 -g 选项

示例:

release版本下进入调试:

调试示例
debug版本下进入调试:

调试示例

不同版本的可执行文件中的调试信息差异:
调试信息差异

1 gdb的使用

通过 gdb 可执行文件(debug版本) 可进入调试界面。

1.1 常用调试命令

注意:所有查看内容的指令,不影响实际的调试指令。

  • quit(q) :退出gdb调试器。

  • 源代码显示: 当我们通过gdb进入调试后,默认是不会显示出代码的,此时需要通过 list/l 命令将源代码显示出来:默认只输入 l 表示每次随机从某一行代码开始向下显示出10行代码;输入 l 0 则表示从最开始一行向下显示出10行代码;输入 l 行号 表示从第指定行开始向下显示出10行代码。在一次显示后,紧接着输入回车则会继续向下显示接下来的10行代码(gdb会自动记录最近输入的一条命令);输入 l 函数名 表示以该函数名所在行为中间行,显示其上下10行代码。
    在这里插入图片描述

  • 运行程序: 输入命令 run/r 表示运行程序,相当于VS下的快捷键 F5 ,如果没有添加任何断点,将直接运行完程序,若是碰到断点,则停下。

运行程序

  • break(b) 行号 :在某一行设置断点。

  • break(b) 函数名 :在某个函数开头(函数内的第一行代码)设置断点。也可以输入 break(b) 文件名:函数名 在指定文件的某个函数开头设置断点。

  • info break(b) :查看断点信息。每个断点都有自己的编号,在不退出gdb的情况下断点编号会依次递增。

  • delete breakpoints n(d n) :删除编号为n(不是当前断点的行号)的断点。

  • delete breakpoints(d) :删除所有断点。
    断点示例

  • disable breakpoints n :禁用编号为n的断点,考虑到之后调试可能还需要用到某个断点,不想一次删除,可以使用该命令禁用断点,待到需要时再启用。

  • enable breakpoints n :启用编号为n的断点。
    断点使能

  • next(n) :单条执行,逐过程执行,不进入函数。
    逐过程执行

  • step(s) :逐语句执行,进入函数调用。

  • breaktrace(bt) :查看各级函数调用及参数。

  • p 变量名 :查看变量值,每次查看时都需要输入命令。

  • display 变量名 :跟踪查看一个变量(内置类型,结构体等自定义类型),每次停下来都显示它的值,每个跟踪的变量都有一个编号。(常显示)

  • undisplay n(编号) : 取消对先前设置的编号为 n 的变量的跟踪。

  • until n(行号) :直接运行程序至第 n 行。如当需要一次执行完某个循环时,即可使用该命令。
    示例

  • finish : 执行到当前函数返回,然后停下来等待命令。
    示例

  • continue(c) :从当前位置开始连续而非单步执行程序。可使程序从一个断点处直接运行到下一个断点处。
    示例

  • set var :修改变量值。
    示例

  • print(p) :打印表达式的值,通过表达式可以修改变量的值或调用函数。

  • info(i) locals :查看当前栈帧局部变量的值。


以上是我对Linux中gdb调试器使用的一些学习记录总结,如有错误,希望大家帮忙指正,也欢迎大家给予建议和讨论,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_67216978/article/details/128818546