1.1 gdb符号调试器简介
gdb是一个用来调试C和C++程序的功能强大的调试器,它能在程序运行时观察程序的内部结构和内存的使用情况。
gdb主要提供以下几种功能:
- 监视程序中变量值的变化
- 设置断点,使程序在指定的代码行上暂停执行,便于观察
- 单步执行代码
- 分析崩溃程序产生的core文件
gdb filename(执行文件名)
编译时需加上-g 或 -ggdb3 选项
1.2 gdb功能详解及其应用
1.2.1调试步骤
1.调用gdb
gdb filename
2.设置断点并调试
break functionname/linenumer
run 执行程序
step 单步跟踪程序代码
print命令:
print 表达式
print 变量=表达式
print 开始表达式@要打印连续内存空间的大小
display命令:
display 表达式
在使用display命令时,每次调试器中断程序,挂起指令都要显示变量的值
next命令:
不进入函数内部
quit命令:
退出gdb
1.2.2 显示数据命令
1. print命令与display命令
finish 执行完当前函数
2. 内存检查命令
x /format address
format指显示单元的个数以及显示的格式
例如:x/2c 0x120100fa0
3.printf 类似于c里的printf()函数
例如:printf"%2.2s\n",(char*)0x120100fa0
4.使用set命令
set variable 变量=表达式 设置变量值
1.2.3 使用断点
continue命令和cont命令(cont 数字 表示执行数字次继续)
break 行号
break 函数名
条件断点:
condition 断点编号 表达式 程序在表达式为真时中断
tbreak 行号 临时断点
(break 行号
enable delete 断点号)等效于临时上一个断点
enable 断点编号 恢复失效断点
disable 断点编号 使断点失效
delete 断点编号或表达式 清除断点(无提示信息)
clear 要清除的断点所在行号 清除断点(有提示信息)
1.2.4 使用观察窗口
watch 表达式 如果表达式中某个变量的取值超过了范围,就不能再对表达式取值了。这一点与条件断点设置不同,因为它只在代码的固定位置取值。
1.2.5 查看栈信息
backtrace
bt
bt n 栈顶上n层栈信息
bt -n 栈顶下n层栈信息
frame n
f n n是一个从0开始的整数,是栈中的层编号。比如:frame 0表示栈顶,frame 1表示栈的第二层
up n 表示向栈的上面移动n层,不输入n表示移动一层
down n 表示向栈的下面移动n层
以下为不带提示信息的移动栈层信息:
select-frame n
up-silently n
down-silently n
---------------
frame 或 f 查看当前栈层信息(包括栈层编号,当前函数名,函数参数值,函数所在文件及行号,函数执行到的语句)
info frame 或 info f 该命令会显示更为详细的当前栈层的信息,只不过大多数都是运行时的内地址。
info args 显示出当前函数的参数名及值
info locals 显示出当前函数中所有局部变量的值
info catch 显示当前函数中的异常处理信息
1.2.6 查看源程序
1. 显示源代码
list <linenum> 显示程序第linenum行的周围的源程序。
list <function> 显示函数名为function的函数的源程序
list 显示当前行后面的源程序
list - 显示当前行前面的源程序
set listsize <count> 设置一次显示源代码的行数
show listsize 查看当前listsize的设置
list <first>,<last> 显示从first行到last行之间的源代码
list ,<last> 显示当前行到last行之间的源代码
list + 向后显示源代码
一般来说,在list后面可以跟以下这些参数。
<linenum>:行号。
<+offset>:当前行号的正偏移量
<-offset>:当前行号的负偏移量
<filename:linenumber>:哪个文件的哪一行
<function>:函数名
<filename:function>:哪个文件的哪个函数
<*address>:程序运行时的语句在内存中的地址
2.搜索源代码
forward-search <regexp>
search <regexp> 向前搜索
reverse-search <regexp> 全部搜索
3.指定源文件的路径
directory <dirname ...>
dir <dirname ...>
directory 清除所有自定义源文件搜索路径信息
show directories 显示定义了源文件搜索路径
4.源代码的内存
info line 行号/函数名
info line 文件名:行号/文件名:函数名
disassemble func 查看func的汇编代码
disassemble address
1.2.7 查看运行时数据
1.表达式
@ 一个和数组有关的操作符
:: 指定一个在文件或是一个函数中的变量
{<type>} <addr> 表示一个指向内存地址<addr>的类型为type的一个对象
2.程序变量
全局变量(所有文件可见)
静态全局变量(当前文件可见的)
局部变量(当前Scope可见的)
示例:
file::variable
function::variable
p 'f2.c'::x
3.数组
例如:程序中有如下语句
int *array = (int *)malloc(len * sizeof(int));
p *array@len
如果是静态数组的话,直接用"print 数组名"就可以显示数组中所有数据的内容了。
4.输出格式
x 按十六进制格式显示变量
d 按是禁止格式显示变量
u 按十六进制格式显示无符号整形
o 按八进制格式显示变量
t 按二进制格式显示变量
a 按十六进制格式显示变