当前位置: 首页 > news >正文

GDB调试命令详解

1. GDB简介

GDB(GNU Debugger)是GNU项目开发的功能强大的调试器,支持多种编程语言,包括C、C++、Fortran等。GDB可以帮助开发者:

  • 查看程序的执行状态
  • 设置断点和观察点
  • 单步执行程序
  • 检查变量和内存
  • 分析程序崩溃原因
  • 进行远程调试

2. 基本启动命令

2.1 启动GDB

# 直接启动GDB gdb # 启动GDB并加载可执行文件 gdb <可执行文件> # 启动GDB并加载可执行文件和核心转储文件 gdb <可执行文件> <核心转储文件> # 调试正在运行的进程 gdb -p <进程ID>

2.2 退出GDB

# 退出GDB quit # 或 q

3. 断点管理

3.1 设置断点

# 在指定行设置断点 break <文件名>:<行号> # 或 b <文件名>:<行号> # 在指定函数处设置断点 break <函数名> # 或 b <函数名> # 在指定地址设置断点 break *<地址> # 设置条件断点 break <位置> if <条件>

3.2 查看断点

# 查看所有断点 info breakpoints # 或 info break

3.3 删除断点

# 删除指定编号的断点 delete <断点编号> # 或 del <断点编号> # 删除所有断点 delete

3.4 禁用/启用断点

# 禁用指定断点 disable <断点编号> # 启用指定断点 enable <断点编号> # 启用断点并只执行一次 enable once <断点编号>

4. 程序控制

4.1 运行程序

# 运行程序 run # 或 r # 运行程序并传递参数 run <参数> # 或 r <参数>

4.2 单步执行

# 单步执行,不进入函数 next # 或 n # 单步执行,进入函数 step # 或 s # 单步执行直到当前函数返回 finish # 继续执行直到遇到下一个断点 continue # 或 c

4.3 控制执行速度

# 执行指定数量的语句 step <数量> # 或 next <数量> # 执行直到指定位置 until <位置>

5. 查看和修改数据

5.1 查看变量

# 查看变量值 print <变量名> # 或 p <变量名> # 以指定格式查看变量 print /<格式> <变量名> # 格式说明: # x - 十六进制 # d - 十进制 # u - 无符号十进制 # o - 八进制 # t - 二进制 # a - 地址 # c - 字符 # f - 浮点数 # 查看数组或结构体 print <数组名> print <结构体名> # 查看表达式结果 print <表达式>

5.2 查看内存

# 查看指定地址的内存 x/<n><f><u> <地址> # 说明: # n - 显示的单元数 # f - 显示格式(同print命令) # u - 每个单元的大小: # b - 字节 # h - 半字(2字节) # w - 字(4字节) # g - 双字(8字节) # 示例:查看从地址0x12345678开始的10个字节,以十六进制格式显示 x/10xb 0x12345678

5.3 修改变量值

# 修改变量值 set variable <变量名> = <新值> # 或 set <变量名> = <新值> # 示例:将变量i的值设置为10 set variable i = 10

5.4 查看寄存器

# 查看所有寄存器 info registers # 查看指定寄存器 info registers <寄存器名> # 示例:查看 eax 寄存器 info registers eax

6. 堆栈管理

6.1 查看堆栈

# 查看堆栈回溯 backtrace # 或 bt # 查看指定数量的堆栈帧 backtrace <数量> # 或 bt <数量>

6.2 切换堆栈帧

# 切换到指定堆栈帧 frame <帧编号> # 或 f <帧编号> # 切换到上一个堆栈帧 up # 切换到下一个堆栈帧 down

6.3 查看当前堆栈帧信息

# 查看当前堆栈帧信息 info frame # 查看当前堆栈帧的局部变量 info locals # 查看当前堆栈帧的参数 info args

7. 高级功能

7.1 观察点

# 设置观察点(当变量值改变时中断) watch <表达式> # 设置读观察点(当变量被读取时中断) rwatch <表达式> # 设置访问观察点(当变量被读写时中断) awatch <表达式> # 查看观察点 info watchpoints

7.2 信号处理

# 查看信号处理 info signals # 设置信号处理 handle <信号> <操作> # 操作可以是: # stop - 收到信号时停止 # print - 收到信号时打印信息 # pass - 将信号传递给程序 # noprint - 不打印信息

7.3 命令脚本

# 定义命令脚本 define <命令名> <命令序列> end # 示例:定义一个显示所有局部变量的命令 define show_locals info locals end

7.4 远程调试

# 作为服务器启动GDB gdbserver <主机>:<端口> <可执行文件> # 连接到远程GDB服务器 target remote <主机>:<端口>

8. 实际使用示例

8.1 基本调试流程

  1. 编译程序时添加调试信息
    gcc -g -o program program.c
  2. 启动GDB并加载程序
    gdb program
  3. 设置断点
    break main break 42 break function_name
  4. 运行程序
    run
  5. 单步执行
    next step
  6. 查看变量
    print variable print array[0] print *pointer
  7. 查看内存
    x/10xw 0x12345678
  8. 继续执行
    continue

8.2 调试崩溃程序

  1. 启用核心转储
    ulimit -c unlimited
  2. 运行程序直到崩溃
  3. 使用GDB分析核心转储
    gdb program core
  4. 查看崩溃位置
    backtrace

9. 常用命令速查表

命令简写功能
breakb设置断点
deletedel删除断点
runr运行程序
nextn单步执行(不进入函数)
steps单步执行(进入函数)
continuec继续执行
printp查看变量值
xx查看内存
backtracebt查看堆栈回溯
framef切换堆栈帧
info breakpointsinfo break查看断点信息
info locals-查看局部变量
info args-查看函数参数
watch-设置观察点
quitq退出GDB

10. 高级调试技巧

10.1 条件断点的高级用法

# 当循环变量i等于100时中断 break loop.c:42 if i == 100 # 当指针不为空时中断 break function.c:123 if pointer != NULL

10.2 内存检查

# 检查内存是否可访问 print *((char *)0x12345678) # 查看内存区域 x/20xw 0x10000000

10.3 线程调试

# 查看所有线程 info threads # 切换到指定线程 thread <线程ID> # 设置线程特定断点 break <位置> thread <线程ID>

10.4 加载共享库符号

# 查看已加载的共享库 info sharedlibrary # 加载共享库符号 sharedlibrary

11. 总结

GDB是一个功能强大的调试工具,掌握其基本命令和高级功能可以大大提高开发和调试效率。通过本文档的学习,您应该能够:

  • 熟练使用GDB的基本命令进行程序调试
  • 设置和管理断点、观察点
  • 查看和修改程序运行时的状态
  • 分析程序崩溃原因
  • 使用高级功能进行复杂调试

实践是掌握GDB的最佳方法,建议在实际项目中多使用GDB进行调试,逐渐熟悉各种命令和技巧。

http://www.jsqmd.com/news/533455/

相关文章:

  • 北京诚信的别墅装修设计公司推荐,好用的有哪些呢? - 工业品牌热点
  • 广度优先搜索(BFS)零基础精讲
  • QGIS实战指南 | 从零构建城市绿地空间分析项目,解锁规划应用全流程
  • 买持妆男士素颜霜?2026实测对比:左颜右色等5款热门单品选购指南 - 资讯焦点
  • .NET反编译神器ILSpy:免费开源工具完整使用教程与实战指南
  • 聊聊2026年广州吸料机供应企业,哪家专业靠谱有口碑 - 工业品牌热点
  • 5个专业技巧让你的3D模型表面细节提升10倍
  • PowerPaint-V1 Gradio部署指南:国内镜像加速,消费级显卡流畅运行
  • OpCore Simplify:开源智能配置工具重塑黑苹果EFI生成体验
  • 开源工具赋能旧设备:使用OpenCore Legacy Patcher实现Mac系统升级
  • 2026年可回收铺路板性价比排行,推荐能批量定制的铺路板厂家 - mypinpai
  • 别再让AI瞎忙了!手把手教你用Claude Code的SubAgent打造专属‘开发团队’
  • PDF补丁丁深度解析:专业级PDF处理解决方案实战指南
  • LFM2.5-1.2B-Thinking-GGUF保姆级教程:Web界面响应超时与max_tokens关系
  • glibc内存管理:malloc与free原理详解
  • vxe-table vue 虚拟滚动实战:从列表到树形表格的高性能优化方案
  • 告别环境配置噩梦:用悬剑5武器库快速搭建你的渗透测试虚拟机(附下载与启动指南)
  • 【RNN,LSTM,GRU,Seq2Seq,Attention,】
  • 3个惊人技巧让Google Drive下载效率飙升500%:零配置的终极解决方案
  • 2026权威评测:毕业论文“AIGC痕迹”怎么破?免费降重首选
  • 生成式人工智能与-LangChain-第二版-全-
  • 开源工具OpenToonz:专业级2D动画创作平台全解析
  • C#项目版本号管理进阶:除了自动递增,你还需要知道的GitVersion和语义化版本(SemVer)实践
  • 中山模温机好用的品牌,大概多少钱 - mypinpai
  • ExplorerPatcher:重塑Windows界面体验的开源工具
  • 亚马逊-SageMaker-深度学习负载加速指南-全-
  • Harness Engineering深度指南(非常详细),软件工程转型控制系统设计,从入门到精通,收藏这一篇就够了!
  • SEO_为什么你的网站排名低?SEO核心问题与解决办法
  • Z-Image-Turbo-辉夜巫女与操作系统结合:为Linux系统生成个性化桌面壁纸脚本
  • 如何高效提取Instagram公开数据?Toutatis工具全方位使用指南