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