在项目的开发过程中,熟练使用一种调试工具,对我们的开发效率会有很大的帮助。
对于嵌入式软件开发工程师来说,熟练的使用gdb调试是我们的基本技能之一。本文我们以使用递归算法打印斐波拉契数列为例。对应文件名为febolaqi.c,相应的代码对应如下:
#include <stdio.h>
int fobonaqi(int n){
if(n == 0){
return 0;
}
else if(n == 1){
return 1;
}else {
return fobonaqi(n-1)+fobonaqi(n-2);
}
}
void main(){
printf("\n");
for(int i =1; i<=20; i++){
printf("%d ",fobonaqi(i));
}
printf("\n");
}
一 启动和退出gdb
一般有三种方式来启动gdb调试工具。(注意在使用gcc 编译器的使用需要加 –g参数)。
第一种:gdb febolaqi ; 然后 输入 start 开始执行,然后next 跳到下一条语句。
第二种:gdb febolaqi core ; 使用此方法需先获得core文件,当程序运行崩溃的时候,使用此方法可快速定位到程序出错的地方。如没有生成core文件,输入“ulimit –c 5000”命令
第三种:gdb febolaqi pid ; 使用此方法调试已运行的程序
退出gdb: quit
二 获取帮助
gdb提供完备的在线帮助,让我们使用起来更加方便。所有的帮助信息都是通过运行help命令获得的。
如:输入help ; 获取章节列表
输入:help files ; 则会显示files的相关命令。
在此需要补充的几点是:
第一:命令的缩写,比如“run”命令,则输入“r”即可。
第二:tab键如linux命令行一样,具有自动补全功能。
第三:按下enter键,则会重复执行上一条命令。
三 程序的执行
1 :start 程序从头开始执行
2 :next 逐过程执行语句,类似于IDE不进入函数内部那个button.
3:step 逐语句执行,进入函数内部
4:print 打印需要查看的变量值,如print a;
5:list 列出函数清单,list 1 从第一行开始,列出十行。list 1,20 列出1到20行,list fobolaqi 列出fobolaqi这个函数的清单
6:display ;每次执行停顿的时候,都将display变量的值。比如 display i; undisplay 取消
7:kill 当程序无法退出时,kill将该程序强制退出。
8: x 通过x可检查某一内存区域中的数据。x /Nh 表达式 N表示输出字符的个数,h双字节。
四 控制gdb的行为
gdb通过提供参数的形式,让我们能控制其行为。通过使用set 和 show命令,可以设置各个参数。
如:
五 查看符号表
查看符号表,可通过help来获取info,ptype,whatis.三个命令来查看程序中的符号表。
六 断点
gdb支持软件程序员中断,硬件程序中断和数据中断。gdb中设置这三种断点需要使用不同的命令。
第一:软件中断 break 11 在第11行设置断点,然后 continue。还可以通过if设置断点,当满足先觉条件时中断才发生。如:break mpool.c :85 if index = 3
当调试的是一个多线程程序时,可以在break命令完整的语法格式。
break location [thread threadnum] [if condtion]
通过disable和enable命令可以分别使任意一个断点无效和有效。
info breakpoints 查看断点信息
第二:硬件程序断点 hbreak
第三:数据断点的设置需要使用watch命令,其参数是我们观察的值改变的变量名