• GDB列出源码

    在使用 GDB 调试程序时,我们会经常需要展示程序中的代码,但是打印出的代码可能和源文件中的不同,为什么这么说呢?我们在《GDB准备调试阶段》章节中讲到过 GCC 编译器允许-g-O选项同时使用,也就是说 GDB 可以调试优化后的程序。优化的程序中会在源文件中的某些地方改变,所以和编写的文件和程序执行的文件不一致是常见的。

    在 GDB 中展示出代码行有很多的好处,其中最主要的好处就是方便调试。例如,我们需要在程序中的某一处设置断点,如果没有代码展示,会很难实现断点的准确定位。

    list命令

    展示程序中的代码行要使用 list 命令,命令的格式有很多,下面就是对这个命令的详细介绍。

    1.不带参数的 list 命令的使用表示从当前行向下打印,默认显示 10 行代码。

    注意:list 命令会记录打印的位置,如果是第一次使用 list 命令,那么会从程序的第一行开始打印;如果之前使用过该命令,list 就会从上次打印代码的最后一行的下一行开始打印。

    2.标记中心行位置打印代码,命令格式展示如下:

    list [location]

    location 表示为程序中的位置,可以是行号、函数名、地址。例如:

    (gdb) list 2                      //以第二行为中心行开始打印。    
    (gdb) list func                 //以func函数所在行为中心行打印。
    (gdb) list *0x1234             //以标记地址所在行为中心行打印。

    3.指明 list 打印的开始位置和结束位置,命令格式展示如下:

    list [first] , [last]

    first 为打印的起始位置,last 表示打印的结束位置。如果不指明 first 的值表示从当前行开始打印。实例:

    (gdb) list 1 , 5            //打印从第一行开始,到第五行结束。
    (gdb) list  , 5               //打印从当前行开始,到第五行结束。

    4.list 命令从当前行开始偏移,偏移量可以自己指定。命令格式展示如下:

    list  (+/-)[num]

    num 表示当前行的偏移量,+ 表示向下偏移,- 表示向上偏移。实例:

    (gdb) list +2           //从当前行向下偏移 2 行
    (gdb) list -2            //从当前行向上偏移 2 行

    注意:如果程序运行到断点处使用 list 命令,GDB 会将断点处所在行设置为中心行打印代码。

    设置 list 打印行数

    在 GDB 中使用 list 命令默认打印的代码行数为 10 行,其实代码打印的行数是可以更改的,我们可以通过设置 GDB 中的 listsize 实现,命令格式如下:

    set listsize [num]

    num 表示设置的代码打印的行数。实例:

    set listsize 5          //设置打印的行数为 5 行。
    set listsize 6          //设置打印的行数为 6 行。

    显示 listsize 的值可以使用命令:

    show listsize

    综合调试实例

    文件代码展示:

    #include <stdio.h>
    #include <stdlib.h>

    int add(int a,int b)
    {
        return a + b;
    }

    int main(void)
    {
        int a = 10; 
        int b = 20; 
        int c;
        c = add(a,b);
        printf("%d",c);
        return 0;
    }

    GDB调试:

更多...

加载中...