GDB解决单步调试问题

在 GDB 中使用 step 和 next 命令分步调试程序非常的方便,但使用时可能会遇到一些问题,那么会遇到哪些问题呢?例如:
  1. 程序中出现循环语句,如果过使用 step 或者 next 命令进行分步调试就会进入循环,并且只有当循环结束后才会继续向下执行。

  2. 在调试被调用的函数时,如果你已经获取了相关的调试信息,并且剩余的部分不再需要调试,那么继续执行就会很浪费时间。

上述的问题是我们使用单步调试程序时会经常遇到的,使用 until 命令和 finish 命令就可以完美的解决这些问题。

until命令

until 命令的含义是执行到程序的指定位置,相关的命令格式和使用方式:

until location

location 表示程序中的位置,可以是行号、函数名、一个地址,与 break 命令的使用方式相同。实例:

(gdb) until 16
(gdb) until func()
(gdb) until 0x1234

第一条命令表示程序运行到第 16 行;第二条命令表示程序运行到 func() 函数入口处;第三条命令表示程序运行到地址为 0x1234 处。

until 命令不添加参数的使用方式和 step 命令不加参数的使用效果相同,这个命令主要解决的就是程序分步调试阶段遇到循环语句,实例:

#include <stdio.h>
int main(void)
{
    int i,a = 0;
    for(i = 0;i < 50;i++)
    {
        a += i;
    }
    printf("%d\n",a);
    return 0;
}

1.使用 step 调试程序:

(gdb) s  
9 for(i = 0;i < 50;i++)
(gdb) s
11 a += i;
(gdb) s
9 for(i = 0;i < 50;i++)
(gdb) s
11 a += i;
(gdb) s for(i = 0;i < 50;i++)
……………

程序会进入循环,循环50次。

2.使用until命令调试程序:

(gdb) until 13
main () at test.c:13
13 printf("%d\n",a);

程序跳过循环。

finish命令

finish命令表示的含义是返回到上层函数。就是直接运行完调用函数剩余的部分,返回到上层函数。使用格式:

finish

这个命令就是帮助我们解决将被调用函数的剩余部分执行完成。