GDB 官网:https://sourceware.org/gdb/
pwndbg
pwndbg • Updated Aug 30, 2023
基本用法
b
:设置断点,后面可以跟行号也可以跟函数名
bt
:打印函数调用栈栈顶,后面可以跟数字,指定需要打印的深度
info
:- 后面跟
locals
打印函数内的局部变量, - 跟
args
打印函数的参数, - 后面跟
b
打印断点的信息
n
:继续执行下一行,或者s
x
:打印对应内存中的值,默认打印指针时打印地址x /d 0x00000000
:/d 是十进制查看,p 命令也适用
c
:continue,继续执行到下一个断点
r
:run,开始执行
- 断点管理
disable
断点编号 禁用一个断点enable
断点编号 启用一个断点delete
断点编号 删除一个断点
p
:跟变量名,打印变量值
list
:查看源码,默认是当前位置10行,可以跟行号,显示对应行号的10行,可以跟行号逗号行号,打印范围
step
:进入函数,一般的单步执行中,不会深入到函数中,需要通过 step 进入到函数内部
quit
:退出
shell
:直接运行 shell 中的指令
set loggin on
开启调试的日志
- watchpoint →
watch
,后面跟一个内存地址,当该地址的值改变的时候,会打印新旧变化 - 可以通过
print &i
这样的方法打印栈区变量地址 - 可以通过
info watchpoints
查看已设置的 watchpoint
下图是对 Rust 程序的调试过程截图(有删减),C语言也差不多:
调试一个 Core 文件
core 文件一般不会默认生成
ulimit -a # 查看 ulimit -c unlimited # 取消限制 ulimit -a # 确认 #运行产生 core 文件 gdb 二进制文件 core
调试一个正在运行的程序
gdb -p pid