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 }
下面调试过程中的代码就是以上代码。
编译: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调试基本技巧的主要内容,如果未能解决你的问题,请参考以下文章