多有智慧,就多有愁烦;加增知识的,就加增忧伤。

调试器GDB的使用技巧

上一篇 / 下一篇  2007-06-24 17:08:20 / 个人分类:学而时习

4.1          GDB调试器简介

应用程序的调试试开发过程中必不可少的环节之一。Linux下的GNU的调试器称为GDBGNU Debugger)该软件最早由Richard Stallman编写,GDB是一个用来调试CC++程序的调试器(Debugger)。使用者能在程序运行时观察程序的内部结构和内存的使用情况,GDB是一个基于命令行工作模式下的程序,工作在字符模式,由多个不同的图形用户界面前端予以支持,每个前端都能以多种方式提供调试控制功能,它的功能非常丰富,适用于修复程序代码中的问题,在X Windows系统中,基于图形界面的调试工具称为xxgdb,目前比较新的版本是GDB6.42005122发布),其官方网站是http://www.gun.org/software/gdb。以下是GDB提供的一些功能。

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

可以检查一个变量的值而不管它何时被改变

print

打印表达式的值到标准输出

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.1”

(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命令

gdbrun

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 0x804840a: file new.c line 13.

这样程序执行到第13行语句处就会停止执行。

(gdb) run

Starting program:/home/zxq/new

Please input your Radius:

9.5


TAG:

 

评分:0

我来说两句
请谨慎发帖,本网站会记录您的IP地址。请注意,根据我国法律,网站会将有关您发帖内容、发帖时间以及您发帖时的IP地址的记录保留至少60天,并且只要接到合法请求,即会将这类信息提供给有关政府机构。

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar