gdb

Tags
DevKit
Text
pwndbg
pwndbgUpdated Aug 30, 2023
:优化 gdb 的交互,不影响功能(不输 IDE 的体验)
 

基本用法

  • 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语言也差不多:
notion image
 

调试一个 Core 文件

core 文件一般不会默认生成
ulimit -a # 查看 ulimit -c unlimited # 取消限制 ulimit -a # 确认 #运行产生 core 文件 gdb 二进制文件 core

调试一个正在运行的程序

gdb -p pid