嵌入式开发工具之调试器gdb
gdb是GNU发布的一款功能非常强大的程序调试工具。
GDB主要完成下面三个方面的功能:
- 启动调试程序
- 让被调试的程序在指定的位置停住
- 当程序被停止时,可以检查程序状态-变量值
要在程序中启用gdb,必须先添加调试信息,就是下面这个指令:
gcc -g hello.c -o hello//-g选项的作用是在可执行文件中加入源文件信息,但并不是将源文件嵌入可执行文件,所以在调试时必须保证gdb必须能找到源文件
gdb hello//进入调试器中调试程序
在gdb中一些简单的调试命令
(gdb)run //运行程序
(gdb)list //查看当前运行的程序
以下命令对list的扩展学习
一个具体的例子演示:
tst.c源码
#include <stdio.h>
int sum(int n)
{
int sum = 0;
for(i = 0; i < n; i++)
{
sum += i;
}
return sum;
}
int main()
{
int i;
int a =0;
for(i = 1; i <= 100; i++)
{
a += i;
}
printf("a = %d\n",a);
printf("sum = %d\n",sum(100));
}
1.gdb启动
2.l命令
(1)help l或help list
查看list命令帮助
(2)l(list)列出源码
No symbol table is loaded. Use the “file” command.出现这个的原因是:源文件在编译时,没有使用 -g 参数,重新编译使用list命令。
l命令一次只能列10行
l命令到代码末后继续l
(3)继续l或空格键
或使用空格键
表示上一个l命令后,列出后面的代码可以继续l命令或者直接敲回车键。
(4)l 数字命令
表示查看11周围10行代码,即6-15行。l 1可从头查看源码。
(5)l -命令
表示查看上一个l命令查看的代码之前的10行,即1-5行。
(6)l 数字,数字
表示查看6-20行的源码
(7)l 函数名
表示查看main函数周围10行代码。
(8)l 文件名:数字
表示查看tst.c文件第6行周围的10行代码
(9)l 文件名:函数名
表示查看tst.c文件中main周围10行代码
(gdb) break (行号)/(函数名)/带if的条件语句
eg:
(gdb)break 11//在11行停止
(gdb) break funcl1//函数调用前停止
(gdb) break 21 if i=15 //在21行有for(i =0 ; i <= 100; i++)在i =15停止
(gdb)delete (断点编号)
//如何查看断点编号
(gdb)info break//查看所有的断点信息
2、单步执行
(gdb)next
(gdb)step
【区别】next在断点之后单步执行,遇到子函数调用,无法进入子函数内部单步执行,而step可以。
3、如何查看断点处当前的变量值
(gdb)print <变量名>
4、在断点之后如何继续运行程序
(gdb)continue //直接将程序运行结束
(gdb)finish //结束当前所在函数的运行
个人的一些学习感悟:
在学习gdb的过程中,深刻的感受到gdb功能的强大,一些命令的学习需要我们慢慢的学习,可能一下无法了解太多,但在今后的学习中,不管是学习gdb,还是其他的,一定要掌握好的学习方法,不管是现在在学校的学习还是将来在工作中,养成一个好的学习习惯非常重要,能够使我们终身受益。