设置多个窥探器调试:
set detach-on-fork off
set target-async on
set non-stop on
set pagination off
切换窥探器
inferior [1]
调试正在运行的进程
attach pid
detach
常用查看数据命令
print [格式] [表达式]
格式:
/f 作为浮点数打印
/x 16进制格式
/t 使用二进制的格式打印
/a 作为地址
/c 字符常量格式打印
表达式:
任何常量、变量或者语言中定义的操作符在表达式中都是合法的。支持常量数组,语法为{ele, ele}。
支持的操作符包括@和::,@是二进制操作符,将内存的部分视作数组;::指定文件或者函数中定义的变量。
程序变量:
最常见的表达式使用变量名,表达式中的名字是在被选中的stack帧中理解,所以变量要么是全局,要么遵循作用域的规则而可见;
file::variable
function::variable
智能数组:
打印在内存中多个同类型对象很有用,例如数组的某段,或者指针指向的动态数组;
int *array = (int *)malloc(len * sizeof(int));
p *array@len: @左操作数必须驻留在内存中。
p &var: 打印某个变量的地址
inspect
x命令
x /nfu addr
n:重复次数
f:显示格式
u:单元尺寸 b,h,w,g
自动显示:
display expr: 将expr加入到表达式列表中
undisplay dnums: 根据编号从表达式列表移除表达式;
寄存器:
引用机器寄存器内存,在表达式中通过$+名字作为变量
info registers:打印所有寄存器的名字和数值,除了浮点寄存器以外;
info all-registers:打印所有寄存器的值,包括浮点寄存器
打印设置:
set print address[on/off]: 打印内存地址,显示栈的地址,数据结构值,
set print array [on/off]: 打印数组
set print elements [num]: 设置数组元素打印个数上线
set print pretty on
set print demangle: 按照原始形式打印C++名称;
set print asm-demangle
set demangle-style {auto | gnu | hp | lucid | arm}
set print object :打印对象的指针
set print static-members :打印静态成员
set print vtbl: 打印C++虚函数表
历史值:
print命令打印的值被保存在value history中。为了引用任何以前的值,使用$符号+value_history_编号
栈帧:
调用栈被分割为连续的片,取名为栈帧;每个帧都与一个函数调用联系。帧中保存函数参数,函数本地变量和正在哪个函数中执行的函数地址。
程序一旦启动,首先只有一个main函数的帧,每次函数被调用,新的帧被创建,在函数返回时帧被移除。在程序内,使用地址标识帧,一个帧
由很多字节构成,每个字节都有自己的地址。GDB给每个存在的帧都赋一个数值,从0开始。
frame args: 允许从一个帧移动到另一个帧中。
select-frame:
Backtrace:
backtrace展示如何执行当前位置,一行代表一个帧,起始于当前执行的帧,接着是它的调用者,依次递归。
关于帧的信息:
frame: 打印当前选中帧的简短描述
info frame :打印当前帧的详细描述,包括:
帧的地址;
下一个帧的地址
上一个帧的地址
帧中的参数地址
本地变量在帧中的地址
程序计数器
帧中保存的寄存器
info locals
info args
info catch
info frame addr