GDB调试命令

如何进入gdb模式

形成可执行程序

  1. 在linux下使用gcc/g++、makefile或CMake形成可执行程序时,需要加上-g选项,即程序发布的debug模式;如果不加该选项就默认是release模式;
  2. 如果要进入gdb开始调试,那直接gdb + 可执行程序名即可。

GDB操作指令

行号显示(list)

  • l 行号/函数名表示显示包含该行或该函数的10行代码。
    1. l 表示列出该源文件中的随机10行内容;
    2. l 0l 1 表示从从第一行开始往下显示10行的内容;
    3. l m 表示显示包含第m行的10行代码;
    4. l 函数名 表示显示函数名的前后10行代码;
    5. l m,n 表示显示从第m行到第n行的代码。

断点设置(break)

  1. b 行号 表示在该行打断点;
  2. b 源文件:行号 表示在该源文件中的这行加上一个断点;
  3. b 源文件:函数名 表示在该函数的第一行打上断点。

查看断点信息

  1. info 表示查看所有的调试信息;
  2. info b 表示查看所有断点的信息;
  3. 断点的字段信息:
    • Num —— 编号
    • Type —— 类型
    • Disp —— 状态
    • Enb —— 是否可用
    • Address —— 地址
    • What —— 在此文件的哪个函数的第几行

删除断点

  1. d + 当前要删除断点的编号 表示删除一个断点,不可以d + 行号;
  2. d + breakpoints 表示删除所有的断点;
  3. 删除断点后重新打上该断点,该断点编号没有恢复,而是继续上面的编号;因为没有退出过gdb,所以会持续上一次的编号继续往下。

开启 / 禁用断点

  1. disable b(breakpoints) 表示使所有断点无效(默认缺省);
  2. enable b(breakpoints) 表示使所有断点有效(默认缺省);
  3. disable b(breakpoint) + 编号 表示禁用该断点(不删除);
  4. enable b(breakpoint) + 编号 表示开启该断点;

运行 / 调试

  1. r(run) ,用于启动/重新启动被调试的程序,相当于F5:无断点,直接运行到程序结束;有断点,在第一个断点处停止运行;
  2. 程序停止后,再run相当于重新开始。

逐过程和逐语句

  1. n(next) 表示逐过程(单步跟踪),相当于F10。F10是在当前的函数执行过程中进行单步调试,不会进入到执行函数的内部进行更加详细的调试过程。
  2. s(step) 表示逐语句(单步跟踪进入),相当于F11。F11是需要进入到当前执行函数的内部,进行更加详细的调试的过程。你可以使用finish命令来执行完当前函数的剩余部分并返回到上一层调用。
  3. n 和 s 都是在两个断点之间执行调试。

打印 / 追踪变量

  1. p(print) 变量名 表示打印变量值;
  2. display 变量名/结构体 表示跟踪查看一个变量,每次停下来都显示它的值;
  3. undisplay 变量名编号 表示取消对先前设置的那些变量的跟踪。

查看函数调用

bt查看底层函数调用的过程(函数压栈)。

修改变量的值

set var 变量 = 值 修改变量的值,在调试过程中进行设置变量的值,其他值不变。

指定行号跳转

until 行号 表示进行指定位置跳转,下一步就跳转到执行该行代码,知道遇到断点为止。

强制执行函数

在函数内部使用finish表示立刻执行完该函数并返回,然后停下来等待命令。

跳转到下一断点

c(continue) 表示从一个断点处,直接运行至下一个断点处(等价于VS下不断按F5)。

core文件调试

什么是 core 文件

core 文件,确切说是 core dump 文件,core 是内存的映像,当程序崩溃时,dump 是“扔出来”的意思,即核心已转储,实际上就是有问题的程序运行后,产生“段错误(核心已转储)”时生成的具有堆栈信息和调试信息的文件。

如何生成 core 文件

  1. 使用 ulimit -c 查看core开关,如果为0表示关闭,不会生成core文件;
  2. 使用 ulimit -c [filesize]设置core文件大小,当最小设置为4之后才会生成core文件
  3. 使用 ulimit -c unlimited 设置core文件大小为不限制,这是常用的做法

调试过程

  1. 编译时加上-g选项,程序运行出现错误,在当前目录生成core文件。
  2. 使用core文件记录的信息进入程序调试gdb XX.exe -c core.XX,-c可以省略。
  3. 进入调试环境后,gdb 会直接给出代码奔溃的位置。
    1. 使用l可以显示崩溃点上下文代码。
    2. 使用bt可以查看崩溃点附近调用栈信息;f + n表示进入栈的第n层;down表示进入栈的下一层(更深层),up表示退回到栈的上一层。

跟踪正在运行的程序–gdb attach

  1. 在运行程序的同时,打开另一个端口。
  2. 使用top查看进程编号。
  3. 输入gdb进入调试环境。
  4. 输入attach命令跟踪该进程,显示运行报错。