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

相关推荐
埃博拉酱2 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
唐宋元明清21883 天前
.NET 本地Db数据库-技术方案选型
windows·c#
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
tryCbest3 天前
Windows环境下配置pip镜像源
windows·pip
呉師傅3 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
百事牛科技3 天前
保护文档安全:PDF限制功能详解与实操
windows·pdf
一个人旅程~3 天前
如何用命令行把win10/win11设置为长期暂停更新?
linux·windows·经验分享·电脑
一个假的前端男3 天前
[特殊字符] Flutter 安装完整指南 Windows—— 2026最新版
windows·flutter
倚肆3 天前
在 Windows Docker 中安装并配置 Nginx (映射 Windows 端口与路径)
windows·nginx·docker
破无差3 天前
拯救你的C盘
windows