一段c语言程序:

#include <stdio.h>
int main(){
    int num,result=0,i=0;
    scanf("%d", &num);
    while(i<=num){
        result += i;
        i++;
    }  
    printf("result=%d\n", result);
    return 0;
}

1. print

1.1 功能

在 GDB 调试程序的过程中,输出或者修改指定变量或者表达式的值。

1.2 语法

(gdb) print num
(gdb) p num

其中,参数 num 用来代指要查看或者修改的目标变量或者表达式。

1.3 示例

[root@localhost day6]# gcc test1.c -o test1 -g
[root@localhost day6]# gdb test1 -q
Reading symbols from /home/gdb/day6/test1...done.
(gdb) l 0
1	#include <stdio.h>
2	int main(){
3	    int num,result=0,i=0;
4	    scanf("%d", &num);
5	    while(i<=num){
6	        result += i;
7	        i++;
8	    }  
9	    printf("result=%d\n", result);
10	    return 0;
(gdb) 
11	}
(gdb) b 3
Breakpoint 1 at 0x40057a: file test1.c, line 3.
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040057a in main at test1.c:3
(gdb) r
Starting program: /home/gdb/day6/test1 

Breakpoint 1, main () at test1.c:3
3	    int num,result=0,i=0;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
(gdb) n
4	    scanf("%d", &num);
(gdb) p num
$1 = 32767
(gdb) b 9
Breakpoint 2 at 0x4005b2: file test1.c, line 9.
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040057a in main at test1.c:3
	breakpoint already hit 1 time
2       breakpoint     keep y   0x00000000004005b2 in main at test1.c:9
(gdb) c
Continuing.
4

Breakpoint 2, main () at test1.c:9
9	    printf("result=%d\n", result);
(gdb) p result
$2 = 10
(gdb) c
Continuing.
result=10
[Inferior 1 (process 1793) exited normally]
(gdb) 

2. display

2.1 功能

使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。

2.2 语法

(gdb) display expr
(gdb) display/fmt expr

其中,expr 表示要查看的目标变量或表达式;参数 fmt 用于指定输出变量或表达式的格式,表 1 罗列了常用的一些 fmt 参数。

注意,display 命令和 /fmt 之间不要留有空格。以 /x 为例,应写为 (gdb)display/x expr。

2.3 示例

[root@localhost day6]# gdb test1 -q
Reading symbols from /home/gdb/day6/test1...done.
(gdb) l 0
1	#include <stdio.h>
2	int main(){
3	    int num,result=0,i=0;
4	    scanf("%d", &num);
5	    while(i<=num){
6	        result += i;
7	        i++;
8	    }  
9	    printf("result=%d\n", result);
10	    return 0;
(gdb) 
11	}
(gdb) b 4
Breakpoint 1 at 0x400588: file test1.c, line 4.
(gdb) b 9
Breakpoint 2 at 0x4005b2: file test1.c, line 9.
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400588 in main at test1.c:4
2       breakpoint     keep y   0x00000000004005b2 in main at test1.c:9
(gdb) r
Starting program: /home/gdb/day6/test1 

Breakpoint 1, main () at test1.c:4
4	    scanf("%d", &num);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
(gdb) display num
1: num = 32767
(gdb) n
5
5	    while(i<=num){
1: num = 5
(gdb) c
Continuing.

Breakpoint 2, main () at test1.c:9
9	    printf("result=%d\n", result);
1: num = 5
(gdb) diaplay result
Undefined command: "diaplay".  Try "help".
(gdb) print result
$1 = 15
(gdb) display/d result
2: /d result = 15
(gdb) 

对于使用 display 命令查看的目标变量或表达式,都会被记录在一张列表(称为自动显示列表)中。通过执行info dispaly命令,可以打印出这张表:

(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
2:   y  /d result
1:   y  num
(gdb) 

其中,各列的含义为:

  • Num 列为各变量或表达式的编号,GDB 调试器为每个变量或表达式都分配有唯一的编号;
  • Enb 列表示当前各个变量(表达式)是处于激活状态还是禁用状态,如果处于激活状态(用 y 表示),则每次程序停止执行,该变量的值都会被打印出来;反之,如果处于禁用状态(用 n 表示),则该变量(表达式)的值不会被打印。
  • Expression 列:表示查看的变量或表达式。

对于不需要再打印值的变量或表达式,可以将其删除或者禁用。

1) 通过执行如下命令,即可删除自动显示列表中的变量或表达式:

例如:

(gdb) undisplay 1
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
2:   y  /d result
(gdb) 

(gdb) delete display 2
(gdb) info display 
There are no auto-display expressions now.
(gdb) 

2) 通过执行如下命令,可以禁用自动显示列表中处于激活状态下的变量或表达式:

(gdb) disable display num...

num... 表示要禁用的变量或表达式的编号,编号的个数可以是多个,表示一次性禁用多个变量或表达式

例如:

(gdb) display num
1: num = 32767
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
1:   y  num
(gdb) disable display 1
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
1:   n  num
(gdb) 

当然根据需要,也可以激活当前处于禁用状态的变量或表达式,执行如下命令即可:

(gdb) enable display num...

例如:

(gdb) enable display num
warning: bad display number at or near 'num'
(gdb) 
warning: bad display number at or near 'num'
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
1:   n  num
(gdb) 

总的来说,每次程序停止执行时,GDB 调试器会将自动显示列表中处于激活状态下的变量或表达式的值打印出来,display 命令可以实现在查看目标变量或表达式的值的同时,将其添加到自动显示列表中,而 print 命令则只会打印出目标变量或表达式的值。

Logo

更多推荐