在使用 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 }