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

相关推荐
航Hang*16 小时前
Windows Server 配置与管理——第3章:文件系统管理
运维·服务器·windows·vmware
无限进步_17 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio
私人珍藏库18 小时前
【Windows】PDF超能助手(1.0.13)
windows·pdf·工具·软件·多功能
仟人斩18 小时前
Windows 下把 VSCode 加入右键菜单(注册表方案)
windows·vscode·上下文菜单
大强同学18 小时前
对比 VS Code:Zed 编辑器编码体验全面解析
人工智能·windows·编辑器·ai编程
加勒比之杰克1 天前
从阻塞 IO 到 epoll:把 Linux 网络 IO 一次讲透
linux·网络·windows·select·多路转接·epoll·poll
涔溪1 天前
腾讯 WorkBuddy 超详细卸载清理文档(适用于 Windows 1011 + macOS 全版本,彻底卸载、不留残留)
windows·macos·ai·workbuddy
取个名字太难了a1 天前
等待块(一)
windows
洒满阳光的庄园1 天前
Tauri Windows 桌面端:环境与构建流程
windows
love530love1 天前
从零搭建本地版 Claurst:基于 Rust 重构的 Claude Code 终端编码助手 + LM Studio 模型接入测试
开发语言·人工智能·windows·重构·rust·lm studio·claude code