用gdb调试C与C++程序
2016-05-08 00:05
274 查看
1. GDB简介:
1) 介绍:
GDB是Linux下一个GNU调试程序,是用来调试C与C++程序的强力调试器。能够让用户在程序运行时观察程序的内部结构和内存的使用情况。
2) 功能:
Ø 按照自定义的方式启动运行需要调试的程序。
Ø 可以使用指定位置和条件表达式的方式来设置断点。
Ø 程序暂停时的值的监视。
Ø 动态改变程序的执行环境。
2. 编写示例程序:
为了以下示例容易演示,首先编写一个示例程序。
1) 创建一个C++文件:
3. 基本操作:
这里只介绍常用命令的简单用法,如需读者想更加深入的了解,还请读者参照gdb手册。
1) 基本命令:
Ø 基本命令列表:
Ø 启动:
Ø list命令:
Ø step命令:
Ø continue命令:
Ø print命令:
Ø info break命令:
Ø watch命令:
2) 输入技巧:
Ø 自动补全:
l 键盘上Tab键
l 演示:
4. 完整调试:
1) 代码分析:
分析示例程序可知此代码是一个从1到10的累加算法,其中定义了一个变量n来存储1-10的累加值,主函数中定义变量i切从1循环到10,每一 个循环将i值传入add函数进行累加,并将每次累加后的n值打印出来。在add函数中模拟错误,当传入值为10时,运算n=n/(j-10)将导致除数为 0的情况。
2) 编译运行与错误分析:
Ø 编译运行:
4) 调试演示:
Ø 使用-g选项编译程序:
l 通过文件载入的方式:
Ø 设置断点:
l 普通断点:
由错误分析可知,要在进入add()函数时下个断点,在运算n值表达式时下个断点,n值的运算有2个地方,一个是n=n+j(第7行),一个是n=n/(j-10)(第12行),从而分析其错误。
l 删除断点:
使用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),执行后报错,从而得到程序错误位置。
l 使用条件断点:
1) 介绍:
GDB是Linux下一个GNU调试程序,是用来调试C与C++程序的强力调试器。能够让用户在程序运行时观察程序的内部结构和内存的使用情况。
2) 功能:
Ø 按照自定义的方式启动运行需要调试的程序。
Ø 可以使用指定位置和条件表达式的方式来设置断点。
Ø 程序暂停时的值的监视。
Ø 动态改变程序的执行环境。
2. 编写示例程序:
为了以下示例容易演示,首先编写一个示例程序。
1) 创建一个C++文件:
3. 基本操作:
这里只介绍常用命令的简单用法,如需读者想更加深入的了解,还请读者参照gdb手册。
1) 基本命令:
Ø 基本命令列表:
[align=center]命令[/align] | [align=center]解释[/align] | [align=center]简写[/align] |
[align=center]file[/align] | [align=center]装入想要调试的可执行文件[/align] | [align=center]无[/align] |
[align=center]list[/align] | [align=center]列出产生执行文件源代码的一部分[/align] | [align=center]l[/align] |
[align=center]next[/align] | [align=center]执行一行源代码但不进入函数内部[/align] | [align=center]n[/align] |
[align=center]step[/align] | [align=center]执行一行源代码而且进入函数内部[/align] | [align=center]s[/align] |
[align=center]run[/align] | [align=center]执行当前被调试的程序[/align] | [align=center]r[/align] |
[align=center]continue[/align] | [align=center]继续执行程序[/align] | [align=center]c[/align] |
[align=center]quit[/align] | [align=center]终止GDB[/align] | [align=center]q[/align] |
[align=center]print[/align] | [align=center]输出当前指定变量的值[/align] | [align=center]p[/align] |
[align=center]btrak[/align] | [align=center]在代码里设置断点[/align] | [align=center]b[/align] |
[align=center]info break[/align] | [align=center]查看设置断点的信息[/align] | [align=center]i b[/align] |
[align=center]delete[/align] | [align=center]删除设置的断点[/align] | [align=center]d[/align] |
[align=center]watch[/align] | [align=center]监视一个变量的值,一旦值有变化,程序停住[/align] | [align=center]wa[/align] |
[align=center]help[/align] | [align=center]GDB中的帮助命令[/align] | [align=center]h[/align] |
Ø list命令:
Ø step命令:
Ø continue命令:
Ø print命令:
Ø info break命令:
Ø watch命令:
2) 输入技巧:
Ø 自动补全:
l 键盘上Tab键
l 演示:
4. 完整调试:
1) 代码分析:
分析示例程序可知此代码是一个从1到10的累加算法,其中定义了一个变量n来存储1-10的累加值,主函数中定义变量i切从1循环到10,每一 个循环将i值传入add函数进行累加,并将每次累加后的n值打印出来。在add函数中模拟错误,当传入值为10时,运算n=n/(j-10)将导致除数为 0的情况。
2) 编译运行与错误分析:
Ø 编译运行:
4) 调试演示:
Ø 使用-g选项编译程序:
l 通过文件载入的方式:
Ø 设置断点:
l 普通断点:
由错误分析可知,要在进入add()函数时下个断点,在运算n值表达式时下个断点,n值的运算有2个地方,一个是n=n+j(第7行),一个是n=n/(j-10)(第12行),从而分析其错误。
l 删除断点:
使用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),执行后报错,从而得到程序错误位置。
l 使用条件断点:
相关文章推荐
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 将两个递增的有序链表合并为一个递增的有序链表(C语言编程实现)
- C语言查看程序运行的时间
- C语言入门学习视频
- c++作业5
- Effective C++: std::bind特性/std::bind实现.
- C++11: chrono
- C++学习零碎知识
- 弄清楚C语言中的取反和反码
- 循环队列(C语言实现)
- C语言中,结构体成员变量的点和箭头
- 算法导论——红黑树插入算法C++实现
- C++ 从数据库读取数据,将数据显示在界面上的TreeCtrl上
- c++作业5,数组分离,成绩,数组选择
- c++第五次作业
- 链表1
- 值得推荐的C/C++框架和库
- C++实验5--数组分离
- 如何用c语言调用c++做成的动态链接库
- c++实验5-求和