主要作用
一般来说,GDB主要帮助你完成下面四个方面的功能:
- 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
- 3、当程序被停住时,可以检查此时你的程序中所发生的事。
- 4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
gdb操作
注:
gdb命令操作中是允许简写的,例如run,用r代替。
查看帮助
(gdb)help:
查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h
执行程序
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<;和>;)和shell通配符(*、?、[、])在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。
利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。
(gdb) file [a.out] //加载被调试的可执行程序文件。
(gdb)set args –b –x
(gdb) show args
(gdb)r //执行程序
backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程
和调用这些过程的参数
。
补充
(gdb)run:
重新开始运行文件(run-text:加载文本文件
,run-bin:加载二进制文件
),简写r。
(gdb)start:
单步执行,运行程序,停在第一执行语句。
单步运行
(gdb)set:
设置变量的值
(gdb)next:
单步调试(逐过程,函数直接执行),简写n。
(gdb) nexti :
单步一条机器指令,不进入函数。
(gdb)step:
单步调试(逐语句:跳入自定义函数内部执行),简写s。
(gdb)stepi:
单步一条机器指令。
(gdb)continue:
继续运行,简写c。
设置断点
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:
- 1,
break line-number
使程序恰好在执行给定行之前停止。 - 2,
break function-name
使程序恰好在进入指定的函数之前停止。 - 3,
break line-or-function if condition
如果condition(条件)是真,程序到达指定行或函数时停止。(设置条件断点) - 4,
break routine-name
在指定例程的入口处设置断点
如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:
(gdb) break filename:line-number
(gdb) break filename:function-name
要想设置一个条件断点,可以利用break if命令,如下所示:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100
从断点继续运行:continue 命令
断点管理
(gdb) info break :
显示当前gdb的断点信息。
(gdb)delete breakpoints num:
删除第num个断点,简写d。
(gdb)clear number:
清除源文件中某一代码行上的所有断点(注:number 为源文件的某个代码行的行号)。
(gdb)enable breakpoints:
启用断点。
(gdb)disable breakpoints:
禁用断点。
信息查看
(gdb)list:
查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l。
(gdb)backtrace:
查看函数的调用的栈帧和层级关系,简写bt。
(gdb)info:
查看函数内部局部变量的数值,简写i。
(gdb)print:
打印值及地址,简写p。
(gdb)watch:
被设置观察点的变量发生修改时,打印显示。
(gdb)i watch:
显示观察点。
(gdb)x:
查看内存x/20xw 显示20个单元,16进制,4字节每单元。
用gdb查看内存
格式: x /nfu
说明
x 是 examine 的缩写
n表示要显示的内存单元的个数
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
函数调用 | 栈帧切换
(gdb)call name:
调用和执行一个函数。
(gdb)finish:
结束当前函数,返回到函数调用点。
(gdb)frame:
切换函数的栈帧,简写f。
(gdb)up n:
表示向栈的上面移动n层,可以不打n,表示向上移动一层。
(gdb)down n:
表示向栈的下面移动n层,可以不打n,表示向下移动一层。
GDB查看,执行汇编语言
(gdb) disassemble:
查看汇编代码。
机器语言工具
有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器
,gdb提供了目 前每一台计算机中实际使用的4个寄存器的标准名字:
$pc :程序计数器
$fp :帧指针(当前堆栈帧)
$sp :栈指针
$ps :处理器状态