gdb一图够
2022-02-28 14:04:13 0 举报
AI智能生成
gdb最重要的指令用法总结。
作者其他创作
大纲/内容
断点
匿名空间断点
break(b) (anonymous namespace)::func
指令地址断点
b *0x400522
文件行号断点
b file:N
断点配置保存/加载文件
save breakpoints file-name-to-save
source file-name-to-save
一次性断点
tbreak(tb)
条件断点
b XXX if i==101
忽略x号断点N次
ignore x N
观察点
设置观察点
watch(wa) a
watch *(data type*)address
查看观察点
info watchpoints
针对某线程的观察点
i thread 找到线程序号,如2
wa a thread 2
读观察点
rwatch(rw) a:a被读时断点
awatch(aw) a:a被读写都会断点
catchpoint事件跟踪
catch evt:当事件evt发生的时候,程序停止运行
exec/fork/vfork: 被调用
动态库
load: 加载动态库
load libname: 加载名为libname的动态库
unload: 卸载动态库
unload libname: 卸载名为libname的动态库
异常
throw: C++异常
catch: C++捕捉到异常
系统调用被调用
syscall [args]: 调用系统调用,args可以指定系统调用号,或者名称
一次性catchpoint
tcatch evt
函数
列出函数名
info functions: 所有函数
info functions reg*: 符合正则的函数
进入函数
step(s), 进入带调试信息的函数
set step-mode on; s: 进入不带调试信息的函数,如printf
退出函数
finish: 运行到函数结束
return exp: 直接return某个value,剩余代码不会被执行
手工执行函数
call
print
栈帧信息
info(i) frame:栈基地址等
disassemble(disas) func:汇编代码
寄存器
i registers eax
i registers: 所有寄存器
p $eax
选择栈帧
bt; frame(f) N:从bt看栈帧层次号,直接选择
f addr:直接跳到指定地址的栈帧
向上/下切换栈帧
up N
down N
打印
数组中连续元素
p array[60]@10:array 数组第60~69个元素的值
局部变量
bt full [n]:各个函数的局部变量, 若有n则打印到n层为止
i locals:当前函数的局部变量
进程内存映射信息(内存段起止地址)
i proc mappings
i files
静态变量
p 'static-1.c'::var:指定文件中的静态变量
变量类型
whatis a
ptype a
内存值
打印: x/nfu addr
n:输出单元的个数
f:是输出格式
x: 16进制
o: 8进制
u: 无符号10进制
d: 10进制
t: 2进制
c: 字符
s: 字符串
u:标明一个单元的长度
b: 1byte
h: 2byte
w: 4byte
g: 8byte
搜索: find
find[/un] start_addr, +len, val1 [, val2, …]
find &mixed, +sizeof(mixed), (char) 'c', (short) 0x1234, (int) 0x87654321
find[/un] start_addr, end_addr, val1 [, val2, …]
find 0x804c000, 0x806d000, "hellogdb"
派生类型对象
set print object on
代码和汇编指令关联
disas /m fun
查看某一行代码的汇编指令
i line 13:得到指令的起止地址
disas [start], [End]
共享链接库信息
i sharedlibrary [reg*]
源码路径设置
directory(dir) PATH
set substitute-path /home/old /home/new 修改目录路径
改变程序执行
修改变量值
set main::p1="Jil" 修改字符串
set var i = 8 修改变量i
set {int}0x8047a54 = 8 通过地址修改
set var $eax = 8 修改寄存器值,eax存储返回值
修改执行顺序
set var $pc=0x08050949 直接修改PC寄存器指定下一条指令
jump(j) 15 跳转到第15行
0 条评论
下一页