Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126147
  • 博文数量: 10
  • 博客积分: 725
  • 博客等级: 军士长
  • 技术积分: 157
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-08 10:03
文章分类

全部博文(10)

文章存档

2011年(10)

我的朋友

分类: LINUX

2011-07-22 15:28:02

1.         GDB简介:

1)         介绍:
GDB是Linux下一个GNU调试程序,是用来调试C与C++程序的强力调试器。能够让用户在程序运行时观察程序的内部结构和内存的使用情况。
2)         功能:
Ø 按照自定义的方式启动运行需要调试的程序。
Ø 可以使用指定位置和条件表达式的方式来设置断点。
Ø 程序暂停时的值的监视。
Ø 动态改变程序的执行环境。
2.         编写示例程序:
为了以下示例容易演示,首先编写一个示例程序。
1)         创建一个C++文件:

2)         写入代码:

3.         基本操作:
这里只介绍常用命令的简单用法,如需读者想更加深入的了解,还请读者参照gdb手册。
1)         基本命令:
Ø 基本命令列表:

命令
解释
简写
file
装入想要调试的可执行文件
list
列出产生执行文件源代码的一部分
l
next
执行一行源代码但不进入函数内部
n
step
执行一行源代码而且进入函数内部
s
run
执行当前被调试的程序
r
continue
继续执行程序
c
quit
终止GDB
q
print
输出当前指定变量的值
p
btrak
在代码里设置断点
b
info break
查看设置断点的信息
i b
delete
删除设置的断点
d
watch
监视一个变量的值,一旦值有变化,程序停住
wa
help
GDB中的帮助命令
h

Ø 启动:

Ø file命令:

Ø list命令:

Ø next命令:

Ø step命令:

Ø run命令:

Ø continue命令:

Ø quit命令:

Ø print命令:

Ø break命令:

Ø info break命令:

Ø delete命令:

Ø watch命令:

Ø help命令:

2)         输入技巧:
Ø 自动补全:
键盘上Tab键
演示:

输入r后,按2下Tab键,GDB将会把所有是r开头的命令显示出来。输入ru后,按1下Tab键,如果以ru开头的命令只有一个,GDB将会把它自动补全。
Ø 执行上条语句:
键盘上回车键
演示:

4.         完整调试:
1)         代码分析:
分析示例程序可知此代码是一个从1到10的累加算法,其中定义了一个变量n来存储1-10的累加值,主函数中定义变量i切从1循环到10,每一个循环将i值传入add函数进行累加,并将每次累加后的n值打印出来。在add函数中模拟错误,当传入值为10时,运算n=n/(j-10)将导致除数为 0的情况。
2)         编译运行与错误分析:
Ø 编译运行:

Ø 错误分析:
此时n值为45,i值为10,在计算45+10的时候,出现了浮点数例外的错误,那么也就是说在add()函数中计算n值的表达式有问题,这样我们可以下2个断点,在进入add()函数时下个断点,在运算n值表达式时下个断点。或者设置一个当j值为10的条件断点,从而分析其错误。
3)         调试选项:
Ø -g
-g选项告诉GCC产生能被GNU调试器使用的调试信息以便调试你的程序。GCC提供了一个很多其他C编译器里没有的特征,在GCC里你能使-g和-O联用。
演示:

4)         调试演示:
Ø 使用-g选项编译程序:

Ø 启动GDB:
通过直接启动的方式:

通过文件载入的方式:

Ø 查看源文件:

Ø 设置断点:
普通断点:
由错误分析可知,要在进入add()函数时下个断点,在运算n值表达式时下个断点,n值的运算有2个地方,一个是n=n+j(第7行),一个是n=n/(j-10)(第12行),从而分析其错误。

Info break为查看断点信息,可以看到我们在函数的入口(第5行)和n值运算(第7与12行)设置了断点。
条件断点:
设置一个当j值为10的条件断点。

删除断点:
使用del Num来删除断点。

Ø 调试:
使用普通断点:

使用r(run)运行程序后,程序在add函数入口(第5行)停下,此时j的值为1,由错误分析可知,要当j值为10时,程序运行出错,使用 c(continue)程序继续运行,在n=n+j断下(第7行),此时j的值任然是1,再使用c程序继续运行,程序又在第5行断下,j值为2,说明主函数中一次循环完成,就这样不停的c,直至当j值为10时在第5行断下,使用n(next)单步调试,程序跳转到else里的运行内容n=n/(j- 10),再使用n 单步调试执行n=n/(j/10),执行后报错,从而得到程序错误位置。
使用条件断点:

使用r(run)运行程序后,程序在第5行断下,由于所设置断点的条件为if j=10,所以此时的j值为10,使用p j(print j)输出此时j的值,使用n(next)单步调试,程序跳转到else里的运行内容n=n/(j-10),再使用n单步调试执行n=n/(j/10),执行后报错,从而得到程序错误位置。
说明:
此例并不是为了说明条件断点比普通断点好,只是为了灵活使用2种断点用法而举例,对于某一程序具体设置什么断点好还需另行分析。
Ø 退出:

阅读(601) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~