调试器GDB的使用技巧
上一篇 / 下一篇 2007-06-24 17:08:20 / 个人分类:学而时习
4.1 GDB调试器简介
应用程序的调试试开发过程中必不可少的环节之一。Linux下的GNU的调试器称为GDB(GNU Debugger)该软件最早由Richard Stallman编写,GDB是一个用来调试C和C++程序的调试器(Debugger)。使用者能在程序运行时观察程序的内部结构和内存的使用情况,GDB是一个基于命令行工作模式下的程序,工作在字符模式,由多个不同的图形用户界面前端予以支持,每个前端都能以多种方式提供调试控制功能,它的功能非常丰富,适用于修复程序代码中的问题,在X Windows系统中,基于图形界面的调试工具称为xxgdb,目前比较新的版本是GDB6.4(
l 启动程序,并且可以设置运行环境和参数来运行制定程序
l 让程序在制定断点出停止执行
l 对程序作出相应得调整,这样就能纠正一个错误后继续调试。
需要注意的是,GDB调试的是可执行文件,而不是源程序,如果想让GDB调试编译后生成的可执行文件,在使用GDB工具调试程序之前,必须使用带有-g或-gdb编译选项的gcc命令来编译源程序,例如
# gcc –g –o test test.c
只有这样才会在目标文件中产生相应得调试信息,调试信息包含元程序的每个变量的类型和在可执行文件里的地址映射及源代码的行号,GDB利用这些信息使源代码和机器代码关联。
使用gdb命令的语法如下。
# gdb [参数] Filename
下面列举一些常用的参数。
l -help:列出所有的参数,并作简要说明。
l -symbols=file
-s file:读出文件(file)的所有符号。
l -core
-c这里的core是程序非法执行后core dump后产生的文件。
l -directory
-d加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。
l -quiet
-q使用该参数不显示gdb的介绍和版权信息。
4.2 GDB调试命令
运行GDB调试程序通常使用如下的命令。
# gdb Filename
Copyright 2004 Free Software Foundation, Inc
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux-gun”.
(gdb)
之后就可以在系统(gdb)提示符后面输入相应得调试命令了,如果不希望出现gdb的系统信息提示,可以输入下面的命令:
# gdb –q Filename
下表列出了一些常用的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 | 在不退出gdb的情况下运行shell工具 |
continue | 继续执行正在调试的程序 |
下面举一个简单的例子来说明GDB调试命令的使用方法,下面的程序很简单,即通过用户输入一个圆的半径值来求得圆的面积,其源代码如下。
#include<stdio.h>
#include<math.h>
int main(void)
{
float pi=3.1415926;
float R;
float S=0;
printf(“Please input your Raius\n”);
scanf(“%f”,&R);
if (R>=0)
{
S=pi*R*R;
printf(“The value of S is:%f\n”,S);
}
else
printf(“Sorry, Wrong input!!\n”);
return 0;
}
为了方便调试可执行程序,可以用下面的语句来编译该程序。
# gcc –g –o new new.c
开始调试
# gdb –q new
Using host libthread_db library ”/lib/tls/libthread_db.so
(gdb)
出现了(gdb)提示符以后,就可以输入相应得调试命令了。
1、 查看源代码,使用list命令
(gdb) list
1 #include<stdio.h>
2 int main(void)
3 {
4 float pi=3.1415926;
5 float R;
6 float S=0;
7 printf(“Please input your Ridus:\n”);
(gdb)
如上所示,使用list命令之后部分的列出了源代码,而且每行都有相应的行号,如果想列出更多的源代码,可以继续输入list命令(或者直接回车即可)。
2、 运行该程序,用run命令
(gdb)run
Starting program /home/zxq/new
Please input your Radius:
10
The value of S is:314.15926
Program exited normaly
(gdb)
如上所示,适用run命令会执行编译后生成的可执行程序new。
3、 设置断点
gdb可以使用break N命令来设置断点,N表示在源码的第N行处设置断点,例如:
(gdb) break 13
Breakpoint 1 at 0x
这样程序执行到第13行语句处就会停止执行。
(gdb) run
Starting program:/home/zxq/new
Please input your Radius:
9.5
TAG: