gdb调试基本技巧

Posted mrlayfolk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb调试基本技巧相关的知识,希望对你有一定的参考价值。

1  说明

本文主要介绍一些简单的、常用的gdb调试技巧。

环境:GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)

参考文档:《gdb调试技巧》  作者不详

2  测试代码

技术图片
 1 #include <stdio.h>
 2 
 3 int test_func2(void) 
 4 {
 5     int a = 1; 
 6     int b = 2; 
 7 
 8     return a + b;
 9 }
10 
11 void test_func1(int flag)
12 {
13     int a[] = {0x12, 0x23, 0x43, 0x78};
14     int b = 12;
15     int i = 0;
16     
17     if (flag == 0) {
18         return;
19     }
20 
21     for (i = 0; i < sizeof(a)/sizeof(int); i++) {
22         a[i] += b;
23     }
24     
25     for (i = 0; i < sizeof(a)/sizeof(int); i++) {
26         printf("%d	", a[i]);
27     }
28     
29     printf("
");
30     
31     test_func2();
32 
33 }
34 
35 
36 
37 int main(void)
38 {
39     test_func1(1);
40 
41     test_func2();
42 
43     return 0;
44 }
View Code

下面调试过程中的代码就是以上代码。

编译:gcc -g test_gdb.c  (注:必须加上-g参数,表示在文件中加入调试信息)

3  调试步骤

  • 与断点相关

加入一个断点

(gdb) b test_func1

(gdb) break test_func2

注:两种方式是等价的,一般简写为b

加入一个断点并设置进入条件

(gdb) b test_func1 if flag == 1

显示断点信息

(gdb) info b

(gdb) info breakpoints

失能一个断点

(gdb) disable b 2

注:disable了的停止点,GDB不会删除,需要时,enable即可。

使能一个断点

(gdb) enable b 2

删除一个断点

(gdb) delete break 2 

技术图片

  • 运行与查看

运行程序

run或r

列出源代码

list或l

单步调试

next或n

单步跟踪,进入函数

step或s

在指定行停住

(gdb) b 25

继续运行

continue或c

技术图片 

  • 查看运行时的数据

查看某一变量值

(gdb) print b

(gdb) print a[0]

查看静态数组

(gdb) print /x a

注:/x表示以十六进制显示

查看动态数组

(gdb) print /x *a@4

注:@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度

查看内存

(gdb) x/4xh a

语法格式:x/<n/f/u> <addr>

n、f、u是可选的参数。

n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i。

u 表示从当前地址往后请求的字节数,u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。

gdb数据显示格式:

x

按十六进制格式显示变量

d

按十进制格式显示变量

u

按十六进制格式显示无符号整型

o

按八进制格式显示变量

t

按二进制格式显示变量

a

按十六进制格式显示变量

c

按字符格式显示变量

f

按浮点数格式显示变量

 技术图片

查看数组a的内存的四个地址以十六进制显示,每个地址请求4个字节(因为数组成员定义为int):

技术图片 

  • 退出

直接使用quit命令就可退出调试。

以上是关于gdb调试基本技巧的主要内容,如果未能解决你的问题,请参考以下文章

gdb调试中怎么查看其中一行的汇编代码

gdb 调试

gdb调试的基本使用

Linux C/C++代码 使用gdb进行coredump调试

GDB调试技巧:常用命令

gdb调试技巧 找到php执行进程当前执行的代码