Vim教程网(https://vimjc.com)继续介绍 GDB 入门教程系列

在学会了使用 GDB 启动调试、设置调试断点、查看变量值等基础知识后,工作中经常需要使用的 GDB 核心功能便是:调试程序 (即:灵活地控制和跟进程序的执行流程)。

在 GDB 下使用 wi 命令可启动可视化调试。为了便于演示,本文使用 GDB 的可视化调试模式行对下面的简单 demo 进行调试举例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<stdlib.h>

void swapper(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
printf("swapped!\n");
}

int main(int argc, char *argv[])
{
int i = 4, j = 6;
printf("i: %d, j: %d\n", i, j);
swapper(&i, &j);
printf("i: %d, j: %d\n", i, j);
int n = 65535;

while (n--)
{
printf("n: %d\n", n);
}

printf("finish\n");
return 0;
}

假设上述 demo 程序被 GDB 启动并暂停在第 14 行。

(1) next 命令

可以使用 next 命令 (缩写形式 n) 继续执行下一行语句next 6 表示一次性执行 6 次 next 命令,即从当前暂停的语句处往下执行 6 条语句。

gdb next命令

(2) step 命令

next 命令作用的对象是单条语句,如果需要调试进入到某个被调用函数的内部,可以使用 step 命令。

gdb step命令

一条程序代码语句可能由多条机器指令完成,与 nextstep 命令对应的机器指令级别的指令分别是 nextistepi

(3) skip 命令

使用 step 命令进行单步调试时,如果想忽略一些函数,使得单步调试时不单步进入这些函数,可以使用 skip 命令。

例如,skip function swapper 命令表示在使用 step 进行单步调试时,将跳过单步调试 swapper 函数。

gdb skip命令

(4) finish 命令

若想执行完并退出当前正在调试的某个函数,除了一直按 n 命令直到退出函数外,还可以使用 finish (缩写形式 fin) 命令 。

finish 命令表示继续运行程序,直到当前函数执行完成,并打印函数返回时的堆栈地址和返回值及参数值等信息。

(5) return 命令

某些时候,为了控制程序的执行逻辑,可能会在调试函数时希望能提前返回,return 命令可实现这个目标。

return 666 表示忽略当前函数剩余未执行的语句,提前结束函数并将函数返回值设置为 666。

(6) continue 命令

continue 命令 (缩写形式 c) 或 fg 命令可用于控制被暂停程序继续执行,直到遇到下一个断点时被再次暂停。

(7) until 命令

until 命令 (缩写形式 u) 用于指示程序继续运行到某个指定位置。例如,demo 程序暂停在 main 函数内的第 14 行,until 5 命令表示程序将继续执行到第 19 行并暂停。

until 命令可以不带任何参数执行,表示将继续执行程序,直到到达当前循环体外的下一行源代码 (这句话其实比较难理解,官方的解释是:Execute until the program reaches a source line greater than the current)。

gdb util命令

until 结合循环执行,个人感觉有点难以理解,后续会单独写篇文章详细介绍下这个命令。

扩展阅读:

  1. GDB入门教程之如何使用GDB启动调试
  2. GDB入门教程之暂停程序
  3. GDB入门教程之查看变量

《女程序员说》

原创不易,希望能给小女子的公众号加个关注~