GDB调试指南:从入门到精通

1. GDB基础

编译程序以支持调试

bash

复制代码
# 使用 -g 选项编译程序
gcc -g program.c -o program

启动GDB

bash

复制代码
# 直接调试程序
gdb program

# 调试运行中的进程
gdb program pid
# 或
gdb -p pid

2. 基本调试命令

运行程序

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_number

3. 查看信息

查看代码

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 frame

4. 高级调试功能

多线程调试

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 stop

5. 常用示例

调试段错误

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
end

6. 实用技巧

自动化调试

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:2345

Python扩展(GDB 7.0+)

gdb

复制代码
# 在gdb中使用python
python
import gdb
print("当前程序:", gdb.current_progspace().filename)
end

7. 常用命令速查

命令 简写 功能
run r 运行程序
break b 设置断点
continue c 继续执行
step s 单步进入
next n 单步跳过
print p 打印变量
backtrace bt 查看调用栈
frame f 选择栈帧
list l 查看源码
info i 查看信息
quit q 退出

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]:可选的数值,限制输出的栈帧数量。

相关推荐
优选资源分享1 小时前
PowerToys v0.97.0 Windows 窗口优化 + 搜索工具
windows·实用工具
Qiuner2 小时前
软件工程计算机网络WindowService2008 DNS DHCP网络策略和访问策略IIS 相关配置 期末考试实操题操作题windows运维
运维·网络·windows·计算机网络
x***r1512 小时前
Havij 1.12 Free注入漏洞扫描安装步骤详解(附使用教程)
windows
love530love2 小时前
【避坑指南】提示词“闹鬼”?Stable Diffusion 自动注入神秘词汇 xiao yi xian 排查全记录
人工智能·windows·stable diffusion·model keyword
习惯就好zz2 小时前
解决VMware Ubuntu端口映射SSH连接失败问题:无需重启服务器的快速修复方案
服务器·windows·ubuntu·ssh·vmware
小宇的天下2 小时前
Calibre :Standard Verification Rule Format(SVRF) Manual (1-2)
前端·javascript·windows
love530love2 小时前
【故障解析】Stable Diffusion WebUI 更换主题后启动报 JSONDecodeError?可能是“主题加载”惹的祸
人工智能·windows·stable diffusion·大模型·json·stablediffusion·gradio 主题
Filotimo_3 小时前
在java后端开发中,LEFT JOIN的用法
java·开发语言·windows
william_djj5 小时前
python3.8 提取xlsx表格内容填入单个文件
windows·python·xlsx