除了之前介绍的一些常用用法,GDB还有许多其他的功能,也是方便我们使用的。
技巧示例:断点处自动打印
(gdb) start
Temporary breakpoint 1 at 0x804846f: file tricks.c, line 33.
Starting program: /home/delphi/workspace/main.out
Temporary breakpoint 1, main () at tricks.c:33
33 func();
(gdb) break tricks.c:18 < -------- 设置断点
Breakpoint 2 at 0x80483ef: file tricks.c, line 18.
(gdb) info break
Num Type Disp Enb Address What
2 breakpoint keep y 0x080483ef in func at tricks.c:18
(gdb) continue
Continuing.
Breakpoint 2, func () at tricks.c:18
18 st[i].i = i;
(gdb) display /d i < ------- 设置断点处自动打印
1: /d i = 0
(gdb) display /d i*i
2: /d i*i = 0
(gdb) display /a &i
3: /a &i = 0xbffff28c
(gdb) continue
Continuing.
Breakpoint 2, func () at tricks.c:18
18 st[i].i = i;
3: /a &i = 0xbffff28c <-- ---------- 自动打印
2: /d i*i = 1
1: /d i = 1
(gdb) continue
Continuing.
Breakpoint 2, func () at tricks.c:18
18 st[i].i = i;
3: /a &i = 0xbffff28c
2: /d i*i = 4
1: /d i = 2
(gdb) continue
Continuing.
Breakpoint 2, func () at tricks.c:18
18 st[i].i = i;
3: /a &i = 0xbffff28c
2: /d i*i = 9
1: /d i = 3
(gdb) continue
Continuing.
Breakpoint 2, func () at tricks.c:18
18 st[i].i = i;
3: /a &i = 0xbffff28c
2: /d i*i = 16
1: /d i = 4
(gdb) continue
Continuing.
st[0].i = 0
st[0].j = 0
st[1].i = 1
st[1].j = 1
st[2].i = 2
st[2].j = 4
st[3].i = 3
st[3].j = 9
st[4].i = 4
st[4].j = 16
Program exited normally.
技巧示例:符号查看
(gdb) whatis func
type = int ()
(gdb) ptype func
type = int ()
(gdb) whatis struct ST
type = struct ST
(gdb) ptype struct ST
type = struct ST {
int i;
int j;
}
技巧示例:GDB中的代码查看
(gdb) list tricks.c:18 < ------------ 查看指定文件行数及附近的代码
13 struct ST st[5] = {0};
14 int i = 0;
15
16 for(i=0; i<5; i++)
17 {
18 st[i].i = i; < ---------- 我们想要看到的代码
19 st[i].j = i * i;
20 }
21
22 for(i=0; i<5; i++)
(gdb) set listsize 20 < -------------- 修改显示行数的数值
(gdb) show listsize
Number of source lines gdb will list by default is 20.
(gdb) list tricks.c:18
8 int j;
9 };
10
11 int func()
12 {
13 struct ST st[5] = {0};
14 int i = 0;
15
16 for(i=0; i<5; i++)
17 {
18 st[i].i = i;
19 st[i].j = i * i;
20 }
21
22 for(i=0; i<5; i++)
23 {
24 printf("st[%d].i = %d\n", i, st[i].i);
25 printf("st[%d].j = %d\n", i, st[i].j);
26 }
27 }