一.调试器gdb简介(功能)
gdb是GNU发布的一款功能强大的程序调试工具。
功能:启动被调试程序;
让被调试的程序在指定的位置停住(设置断点);
当程序被停住时,可以检查程序状态。
二.调试器gdb的使用
1. gcc –gdemo.c –o demo
gdb demo
2. run 启动被调试程序
list 显示程序内容
gdb中通过list命令查看源码。list每次显示的函数可以指定,下文中假定指定显示的行数为10行。
1) listlinenum: 以linenum指定的行号为中心,显示10行
2) listfunction: 以指定的函数为中心,显示10行
3) list: 重复上一次的list指令,也可以直接按回车键,重复上次指令。
4) setlistsize count: 设置每次显示的行数。
show listsize: 显示已设置的显示行数。
5) listlinespec: 设定显示的文件,list指令都是以指定的文件为域来显示源文件,这个指令可以指定要显示的原文件。
例:list_test.c
以后的list指令都是显示,list_test.c 的源文件。
6) listfirst,last: 显示指定起始行到结束结束行的源文件。
例:list10,100
7) list,last: 显示以指定的last为结束行,显示10行。
例:list ,30 显示21~30行,共显示10行
8) listfirst: 以first为第一行,显示10行。
9) list +:以上次显示的结束行为起始行显示后10行
10) list –:以上次显示的起始行为结束行,显示前10行
3. break20 在20行设置断点
break 20 if i=10 在i=10时停住
break add_sum 在调用函数时停住
info break 查看断点信息
delete 1 删除断点(1为断点编号Num Type)
4. print i 检查程序状态
5. next 不会进入子函数
step 可进入子函数
6. continue 在下一个断点处停住
finish 当前函数结束时停住
7. quit 退出
break 20
run
next
三.调试器gdb调试段错误
段错误:内存错误
产生段错误的原因:
程序运行过程中能访问到的内存空间主要有栈和堆。栈存放函数的本地变量,堆是程序运行过程中能自由分配和使用的内存空间。产生段错误和栈、堆的访问密切相关。
产生段错误的原因主要有:
· 解引用空指针
· 访问不可访问的内存空间(如内核空间)
· 访问不存在的内存地址
· 试图写一个只读内存空间(如代码段)
· 栈溢出(函数递归调用)
· 使用未初始化的指针(定义时没有初始化或者已经回收)
避免段错误:
· 定义指针后初始化
· 数组下标是否越界
· 在堆上分配空间是否足够(内存限制)
· 变量处理时格式控制是否合理
调试段错误:
在代码的每一行下加printf检查段错误发生的位置
gcc –g demo.c
gdb a.out
run //停在段错误处
测试代码模板:
测试版release:gcc demo.c–D__DEBUG__ (出现调试信息)
发行版debug:gcc demo.c (不出现调试信息)