1. GDB基础
编译程序以支持调试
bash
# 使用 -g 选项编译程序 gcc -g program.c -o program启动GDB
bash
# 直接调试程序 gdb program # 调试运行中的进程 gdb program pid # 或 gdb -p pid2. 基本调试命令
运行程序
gdb
# 运行程序 run [参数] # 设置运行参数 set args arg1 arg2 # 显示参数 show args断点管理
gdb
# 设置断点 break main # 函数断点 break file.c:10 # 文件行号断点 break *0x80483c7 # 地址断点 # 条件断点 break main if argc > 1 # 查看断点 info breakpoints # 删除断点 delete 1 # 删除1号断点 delete # 删除所有断点 # 禁用/启用断点 disable 1 enable 1 # 临时断点(只触发一次) tbreak main执行控制
gdb
# 单步执行(进入函数) step # 单步执行(不进入函数) next # 继续执行到下一个断点 continue # 执行完当前函数 finish # 运行到指定行 until line_number # 跳到下一行代码(跳过部分代码) jump line_number3. 查看信息
查看代码
gdb
# 显示当前及附近代码 list list 1,20 # 显示1-20行 list main # 显示main函数 # 设置显示行数 set listsize 20查看变量和内存
gdb
# 打印变量值 print variable print *pointer # 格式化输出 print/x variable # 十六进制 print/d variable # 十进制 print/t variable # 二进制 print/c variable # 字符 # 监视变量 watch variable # 值改变时暂停 watch *0x12345678 # 监视内存地址 # 查看内存 x/10xw 0x12345678 # 查看10个word(十六进制) x/20c variable # 查看20个字符 x/s string_pointer # 查看字符串 # 查看寄存器 info registers print $eax # 查看特定寄存器 # 查看函数参数 info args # 查看局部变量 info locals查看堆栈
gdb
# 查看调用栈 backtrace bt # 查看详细栈帧信息 backtrace full # 切换栈帧 frame 2 # 切换到第2帧 up # 向上一层 down # 向下一层 # 查看当前帧信息 info frame4. 高级调试功能
多线程调试
gdb
# 查看线程 info threads # 切换线程 thread 2 # 所有线程执行命令 thread apply all bt # 只让指定线程运行 set scheduler-locking on观察点
gdb
# 设置观察点 watch variable # 变量被写入时暂停 rwatch variable # 变量被读取时暂停 awatch variable # 变量被读写时暂停信号处理
gdb
# 查看信号处理 info signals # 忽略信号 handle SIGINT ignore # 捕获信号 handle SIGSEGV stop5. 常用示例
调试段错误
bash
# 编译 gcc -g test.c -o test # 启动gdb gdb test # 运行程序 (gdb) run # 程序崩溃后查看堆栈 (gdb) backtrace # 查看寄存器 (gdb) info registers # 查看出错地址的汇编 (gdb) disassemble $pc条件调试
gdb
# 设置条件断点 break main if argc == 2 # 循环中调试 break main.c:50 if i == 100 # 命令列表 commands 1 silent print i continue end6. 实用技巧
自动化调试
gdb
# 在.gdbinit文件中保存配置 set pagination off set history save on # 批处理命令 gdb -x commands.gdb program调试核心转储
bash
# 生成核心转储 ulimit -c unlimited ./program gdb program core远程调试
bash
# 目标机器 gdbserver :2345 program # 开发机器 gdb program target remote target_ip:2345Python扩展(GDB 7.0+)
gdb
# 在gdb中使用python python import gdb print("当前程序:", gdb.current_progspace().filename) end7. 常用命令速查
命令 简写 功能 runr运行程序 breakb设置断点 continuec继续执行 steps单步进入 nextn单步跳过 p打印变量 backtracebt查看调用栈 framef选择栈帧 listl查看源码 infoi查看信息 quitq退出 8. 调试示例
c
// example.c #include <stdio.h> int factorial(int n) { if (n <= 1) return 1; return n * factorial(n - 1); } int main() { int result = factorial(5); printf("5! = %d\n", result); return 0; }调试过程:
bash
# 编译 gcc -g example.c -o example # 调试 gdb example (gdb) break factorial (gdb) run (gdb) next (gdb) print n (gdb) continue
完成代码后,编译脚本,然后生成可执行文件
如果出现报错,会有crash文件,这个是记录崩溃内容的文件,放在了crashs目录下,
在目录之中直接输入gdb,就进入了gdb调试;
gdb ./fuzz_wifi_GetStationFrequency
set args /home/rasp/libfuzzing_scan/crashes/fuzz_wifi_GetStationFrequency/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 #设置命令行参数
break LLVMFuzzerTestOneInput # 打断点,在函数开头
bt full
(gdb) run # 程序崩溃后 (gdb) bt # 查看调用栈 (gdb) info registers # 查看寄存器状态
GDB再学习(5.3):常用指令介绍_backtrace_查看函数栈_gdb back-CSDN博客
bt [option]... [qualifier]... [count]
bt:通常是 backtrace(回溯/调用栈)的缩写,用于显示函数调用栈。
[option]...:可选的一个或多个选项,用于控制输出格式或过滤条件。
[qualifier]...:可选的限定符,常用于筛选特定进程、线程、函数等。
[count]:可选的数值,限制输出的栈帧数量。
