当前位置:Gxlcms > 数据库问题 > gdb调试基本技巧

gdb调试基本技巧

时间:2021-07-01 10:21:17 帮助过:9人阅读

#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\t", a[i]); 27 } 28 29 printf("\n"); 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调试基本技巧

标签:ext   ++   return   ret   lap   one   pac   enter   作者   

人气教程排行