消息显示

1. 启动时不显示提示信息

gdb 默认启动时会显示版本信息。使用 -q 选项可以把提示信息去掉:gdb -q

2. gdb退出时不显示提示信息

gdb 在退出时会提示:

1
2
3
A debugging session is active.
Inferior 1 [process 29686 ] will be killed.
Quit anyway? (y or n) n

如果不想显示这个信息,可以在 gdb 中设置:

1
(gdb) set confirm off

也可以把这个命令加到 .gdbinit 文件中

3. 输出信息多时不会暂停输出

当 gdb 输出信息较多时,gdb 会暂停输出,如下:

1
2
80 process 2573566 0xff04af84 in __lwp_park () from /usr/lib/libc.so.1
---Type <return> to continue, or q <return> to quit---Quit

使用 set pagination off 或者 set height 0 命令。这样 gdb 就会全部输出,中间不会暂停

4. 设置变量的值

在 gdb 中可以:set var variable=expr 命令设置变量的值。

也可以使用 set {type}address = expr 给存储地址在 address,变量类型为 type 的变量赋值。

也可以修改寄存器的值:set var $eax = expr

如下例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int func(void) {
int i = 2;
return i;
}

int main(void) {
int a = 0;
a = func();
printf("%d\n", a);
return 0;
}

使用 gdb 调试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
gdb -q ./main
(gdb) b main_01.cpp:5
Breakpoint 1 at 0x655: file main_01.cpp, line 5.
(gdb) b main_01.cpp:12
Breakpoint 2 at 0x687: file main_01.cpp, line 12.
(gdb) r
Starting program: /data/code/cpp/test/gdb_test/main

Breakpoint 1, func () at main_01.cpp:5
5 return i;
(gdb) p i
$1 = 2
(gdb) set var i = 8 # 设置变量的值
(gdb) p i
$2 = 8


(gdb) p &i
$3 = (int *) 0x7fffffffd57c
(gdb) set {int}0x7fffffffd57c = 10 # 通过地址设置变量的值
(gdb) p i
$4 = 10

5. 打印 ASCII 和宽字符字符串

使用 x/s 命令打印 ASCII 字符串

打印宽字符字符串时,要根据宽字符的长度决定如何打印。当宽字符的长度为 4 字节时,则用 x/ws 命令;如果是 2 字节,则用 x/hs 命令。

1
2
3
4
5
6
7
8
9
10
11
12
Breakpoint 1, main () at main_01.cpp:5
5 char str1[] = "abcd";
(gdb) n
6 wchar_t str2[] = L"abcd";
(gdb) n
7 return 0;
(gdb) x/s str1
0x7fffffffd593: "abcd"
(gdb) p sizeof(wchar_t)
$1 = 4
(gdb) x/ws str2
0x7fffffffd570: U"abcd"

6. 改变字符串的值

可以使用 set 命令改变字符串的值。注意:在改变字符串的值的时候,一定要注意内存越界的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Breakpoint 1, main () at main_01.cpp:5
5 char str1[] = "abcd";
(gdb) n
6 wchar_t str2[] = L"abcd";
(gdb) n
7 return 0;
(gdb) set main::str1 = "ok"
(gdb) set main::str2 = "yes"
(gdb) n
8 }
(gdb) p str1
$2 = "ok\000\000"
(gdb) p str2
$3 = L"\x736579\000\000\000"
(gdb) x/s str1
0x7fffffffd593: "ok"
(gdb) x/ws str2
0x7fffffffd570: U"\x736579"
(gdb) x/s str2
0x7fffffffd570: "yes"

也可以通过访问内存地址的方法改变字符串的值

1
2
3
4
5
6
7
8
9
10
(gdb) p p1
$3 = "abcd"
(gdb) p &p1
$4 = (char (*)[5]) 0x7fffffffd593
(gdb) set {char [5]} 0x7fffffffd593 = "ACE"
(gdb) n
7 printf("p1 is %s, p2 is %s \n", p1, p2);
(gdb) n
p1 is ACE, p2 is YES
8 return 0;