gdb 调试入门
来源:互联网 发布:知商金融官网 编辑:程序博客网 时间:2024/05/03 21:53
GDB是GNU开源组织发布的一个强大的UNIX下的命令行程序调试工具。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。
gdb 常用调试命令
backtrace(或bt)查看各级函数调用及参数
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l)列出源代码,接着上次的位置往下列,每次列10行
list 行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q) 退出gdb调试环境
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,如果有函数调用则进入到函数中
break(或b) 行号 在某一行设置断点
break 函数名 在某个函数开头设置断点
break ... if ...设置条件断点
continue(或c) 从当前位置开始连续运行程序
delete breakpoints 删除断点
display 变量名 跟踪查看某个变量,每次停下来都显示它的值
disable breakpoints 禁用断点
enable 断点号 启用断点
info(或i)breakpoints 查看当前设置了哪些断点
run(或r)从头开始连续运行程序
undisplay 跟踪显示号 取消跟踪显示
watch 设置观察点
info(或i) watchpoints 查看当前设置了哪些观察点
x 从某个位置开始打印存储单元的内容,全部当成字节来看, 而不区分哪个字节属于哪个变量
gdb 调试例子 测试代码如下
#include <stdio.h>
typedef struct testStruc
{
int a;
int b;
}testStruc;
int main()
{
testStruc* pStruc=new testStruc;
pStruc->a=123;
printf("a:%d \n",pStruc->a);
delete(pStruc);
printf("after delete a:%d \n",pStruc->a);
pStruc=NULL;
printf("after set null a:%d \n",pStruc->a);
return 0;
}
编译后 运行 出现 Segmentation Fault 错误
采用gdb进行调试步骤如下
1. g++ -g TestGdb.cpp -o TestGdb -g 选项 编译时加入调试信息
2. gdb TestGdb 准备调试
3. 在运行时 after delete a 这一句已经打印出来,错误应该出现在这句之后
4. break 17 在17行设置断点
5. run 开始运行, 停留在断点处
6. p pStruc 打印出该变量的值为 0x00 因此可判断出错误所在
另外一个隐藏的错误,
delete(pStruc); 语句 执行完内存已经释放但是指针变量没有设置为空,它是个野指针,尽管没有报错,但是这是个隐患。
在 编程的过程中 特别要注意 指针变量的初始化等问题,防止出现野指针,带来不可预知的错误。
独立博客地址:http://www.gddhx.com/post/39.html
- GDB调试入门备忘
- GDB调试入门
- gdb 调试入门
- GDB调试入门
- GDB调试入门篇
- GDB调试程序入门
- gdb调试入门
- GDB调试工具入门
- GDB调试工具入门
- gdb调试简单入门
- GDB调试入门
- 【GDB调试学习笔记】GDB调试入门
- gdb调试讲解,快速入门
- gdb调试程序简单入门
- 服务端入门《五》(gdb 调试)
- linux入门笔记GDB调试
- mb-gdb调试Linux kernel 入门指导
- 【C语言】gdb调试器入门
- iOS 使用两个tableview的瀑布流
- 设计模式——桥接模式
- 递归
- 预编译头文件(precompiled header)
- 排序
- gdb 调试入门
- 中国移动 待遇之我见
- cocos2d-x学习笔记(三)让精灵按照自己设定的运动轨迹行动(曲线移动)。(以椭圆轨迹为例)。
- (转)Consuming Web Services in Oracle
- hibernate外键对应设置
- 你猜它是个什么点
- Linux 创建 Oracle 11g r2 asm磁盘出错
- 黑马程序员_Java中的多线程(线程的生命周期)
- iOS中如何判断是否有网络