Linux下GDB的初步调试
摘要:应用程序的调试是开发过程中必不可以的环节之一。Linux下的GNU的调试器称为GDB(GNU Debugger),所以就让我们先来初识一下GDB吧~
关键词:Linux,GDB
一、 GDB的介绍
●GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。
●使用者能在程序运行时观察程序的内部结构和内存的使用情况。
●GDB是一种基于命令行工作模式下的程序,工作在字符模式,由多个不同的图形用户界面前段予以支持,每个前端都能以多种方式提供调试控制能力。
以下是GDB所提供的的一些功能。
- 启动程序,并且可以设置运行环境和参数来运行指定程序。
- 让程序在指定断点处停止执行。
- 对程序作出相应的调整,这样就能纠正一个错误后继续调试。
注意:
GDB调试的是可执行文件,而不是源程序。如果想让GDB调试编译后生成的可执行文件,在使用GDB工具调试程序之前,必须使用带有- g
或-gdb
编译选项的GCC命令来编译源程序。
例如:
gcc -g -o test test.c
使用GDB命令的语法如下。
gdb [参数] Filename
下面列举一些常用的参数
●-help:列出所有参数,并作简要说明
●-symbols=file
-s file:读出文件(file)的所有符号
●-core
-c:这里的core是程序非法执行后core dump后产生的文件
●-directory
-d:加入一个源文件的搜索路径。默认搜索路径是环境变量中的PATH所定义的路径
●-quiet
-q:使用该选项不显示GDB的介绍和版权信息等
二、 GDB的调试命令
运行GDB调试程序通常使用如下的命令。
命令 | 说明 |
---|---|
file | 指定要调试的可执行程序 |
kill | 终止正在调试的可执行程序 |
next | 执行一行源代码但并不进入函数内部 |
list | 部分列出源代码 |
step | 执行一行源代码并不进入函数内部 |
run | 执行当前可执行程序 |
quit | 结束GDB调试任务 |
watch | 可以检查一个变量的值而不管它何时被改变 |
打印表达式的值到标准输出 | |
break N | 在指定的第N行源代码设置断点 |
info break | 显示当前断点清淡,包括到达断点处的次数等 |
info files | 显示被调试文件的详细信息 |
info func | 显示所有函数名 |
info local | 显示当函数中的局部变量信息 |
info prog | 显示被调试程序的执行状态 |
info var | 显示所有的全局和静态变量名称 |
make | 在不退出GDB的情况下运行make工具 |
shell | 在不退出的情况下运行shell命令 |
continue | 继续执行正在调试的程序 |
三、 GDB调试实例
先检查一下ubuntu中是否已经安装了GDB
gdb -v
目前Ubuntu中已装有GDB,如果没有预装GDB请自行下载。下来我们就来测试一下GDB吧。
3.1 首先创建一个test.c
vim test.c
test.c代码如下:
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while (iNum > 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{
int iNum;
printf("Please input a number :");
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
上面的代码可以逆序输出一个整型数,比如输入123,则输出321。
先来编译出可执行文件,看看有没有语法错误。
3.2 使用gcc生成可执行文件并编译运行
gcc -o test1 test.c
./test1
语法没有报错,但明显出现了逻辑错误。可以看出该代码实现了整数的逆序输出,但当输入100时,逆序输出了010.这时就要派GDB出场了。
3.3 进入gdb
gcc -o test1 -g test.c
gdb test1
提示:进入gdb是必须在命令行键入关键参数-g
GDB进入界面
出现了(gdb)后就可以在其提示符后输入相应的调试命令了。
如果不希望出现gdb的系统进入信息提示,可以输入一下命令
gdb -q Filename
-c:继续执行程序(直到下一个断点或者之后没有断点就运行完整个程序)。
由断点设置来看,iNum的参数类型并没有出现问题。
下来我们就试试-n来检查逻辑错误
-n:一步一步执行程序
通过调试发现,当 iNum=10时,iNum>10为 0,所以程序直接跳出循环,输出 iNum,即 10;因此,最终输出结果为 010。
通过 gdb 调试发现了逻辑错误,即当 iNum=10时,程序会跳出循环,为防止此时程序跳出,只需将 while (iNum > 10)
修改为 while (iNum >= 10)
即可。
至此gdb调试初步完成。
四、 总结
通过此次gdb初步调试,使我基本了解了gdb的工作原理以及运用场景,以及基本掌握了gdb的调试命令。应用程序的调试是开发过程中必不可以的环节之一,使用GDB可以快速,高效的完成程序的设计与纠错。
五、 参考资料
1.《嵌入式Linux系统开发教程》,电子工业出版社,华清远见嵌入式学院。