• GDB单步调试程序


    GDB单步调试程序

    单步调试,就是通过一行一行的执行程序,观察整个程序的执行流程,进而尝试发现一些存在的异常或者 Bug。借助 next 命令可以控制 GDB 单步执行程序。GDB 调试器共提供了 3 种可实现单步调试程序的方法,即使用 next、step 和 until 命令。这 3 个命令都可以控制 GDB 调试器每次仅执行 1 行代码,但除此之外,它们各自还有不同的功能。

    下面以一个C程序来分别介绍三个命令,功能是根据用户输入的 num 值,输出 12+22+...+num2 的值。代码如下:

    #include <stdio.h>
    int print(int num){
        int ret = num * num;
        return ret;
    }
    int myfunc(int num){
        int i = 1;
        int sum = 0;
        while(i <= num){
            sum += print(i);
            i++;
        }
        return sum;
    }
    int main(){
        int num =0;
        scanf("%d", &num);
        int result = myfunc(num);
        printf("%d", result);
        return 0;
    }

    GDB next命令

    next 是最常用来进行单步调试的命令,其最大的特点是当遇到包含调用函数的语句时,无论函数内部包含多少行代码,next 指令都会一步执行完。也就是说,对于调用的函数来说,next 命令只会将其视作一行代码。

    next 命令可以缩写为 n 命令,使用方法也很简单,语法格式如下:

    (gdb) next count

    参数 count 表示单步执行多少行代码,默认为 1 行。

    示例:

    可以看到,当程序单步执行第 18 行时,继续执行 next 指令,下一次将要执行的是第 19 行代码,而非 myfunc() 函数内部的代码。

    GDB step命令

    通常情况下,step 命令和 next 命令的功能相同,都是单步执行程序。不同之处在于,当 step 命令所执行的代码行中包含函数时,会进入该函数内部,并在函数第一行代码处停止执行。

    step 命令可以缩写为 s 命令,用法和 next 命令相同,语法格式如下:

    (gdb) step count

    参数 count 表示一次执行的行数,默认为 1 行。

    示例:

    当程序暂停到包含 mufunc() 函数的代码行处时(此时该行代码尚未执行),如果使用 step 命令,则 GDB 在执行该函数代码的同时,会进入 mufunc() 函数内部,并暂停在函数内部的第一行代码处。反之如果使用 next 命令,则程序下一次会执行第 19 行代码,而不是第 7 行,这就是它们最大的不同之处。

    GDB until命令

    until 命令可以简写为 u 命令,有 2 种语法格式,如下所示:

    1、(gdb) until
    2、(gdb) until location

    其中,参数 location 为某一行代码的行号。
    不带参数的 until 命令,可以使 GDB 调试器快速运行完当前的循环体,并运行至循环体外停止。注意,until 命令并非任何情况下都会发挥这个作用,只有当执行至循环体尾部(最后一行代码)时,until 命令才会发生此作用;反之,until 命令和 next 命令的功能一样,只是单步执行程序。

    示例:

    可以看到,这里当程序单步执行完第 11 行代码时,借助 until 命令快速执行完了整个循环体,并在第 13 行代码处停止执行。根据 p 命令输出的 num 变量的值可以确认,整个循环过程确定完整地执行完了。

    until 命令还可以后跟某行代码的行号,以指示 GDB 调试器直接执行至指定位置后停止。举个例子:

     可以看到,通过执行 until 19 命令,GDB 调试器直接从第 17 行代码处执行至指定的第 19 行。

  • 相关阅读:
    审 讯 技巧
    带参数的多线程的方式
    通达信日线 数据格式
    visual studio 2012 update3
    单实例运行tz
    维特比算法
    Kooboo CMS的安装步骤
    年龄
    富文本编辑器---非常实用的
    printf 打印 unit32_t
  • 原文地址:https://www.cnblogs.com/jkin/p/13837067.html
Copyright © 2020-2023  润新知