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调试:

(gdb) l
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int add(int a,int b)
5 {
6 return a + b;
7 }
8
9 int main(void)
10 {

(gdb) set listsize 5
(gdb) l
11 int a = 10;
12 int b = 20;
13 int c;
14 c = add(a,b);
15 printf("%d",c);

(gdb) show listsize 
Number of source lines gdb will list by default is 5.

(gdb) break 11
Breakpoint 1 at 0x666: file test.c, line 11.

(gdb) run
Starting program: /home/wjc/test/test3/a.out 
Breakpoint 1, main () at test.c:11
11 int a = 10;

(gdb) l
9 int main(void)
10 {
11 int a = 10;
12 int b = 20;
13 int c;

(gdb) list +2
14 c = add(a,b);
15 printf("%d",c);
16 return 0;
17 }

(gdb) list -2
14 c = add(a,b);
15 printf("%d",c);
16 return 0;
17 }