gdb介绍

gdb只是众多调试器中的一个,但是它是用得最多的,所以有必要了解一下。

gdb和gcc一样,都属于gnu开源家族工具链,所以gdb对gcc编译后的程序的调试支持最好。

学习一个工具,当然得先去看它官网,了解清楚整个脉络。

官网:https://www.sourceware/gdb/

我们这里关注如何使用,所以进入它的在线文档网站: https://sourceware/gdb/current/onlinedocs/gdb/

(可能大家通过别的链接进入的网站跟这个不一样,那是因为这个gdb网站服务器里有多个版本的文档仓库,而官网这里进去的,总是最新的版本的文档)

还给了个pdf文档:https://sourceware/gdb/current/onlinedocs/gdb.pdf 这个就是在线文档内容搬过来的,内容和结构基本一样,喜欢看pdf的可以看这个。

gdb的调试方式和概念

gdb调试的方式主要有本地调试和远程调试,可以看我这篇文章:gdb调试常用概念整理_标biao的博客-CSDN博客_gdb target

gdb教程结构

点进去在线文档后,我们发现内容就包括如下部分:(重要的加粗显示,关键性的标红显示)

  • Invocation (Debugging with GDB) 如何启动和退出gdb
  • Commands (Debugging with GDB) gdb的命令行规则与说明
  • Running (Debugging with GDB) 如何启动一个被调试程序(inferior) 
  • Stopping (Debugging with GDB) 单步运行,断点设置等
  • Reverse Execution (Debugging with GDB) 程序倒退运行,这个需要被调试对象的支持,很少能支持这个
  • Process Record and Replay (Debugging with GDB) 调试时候记录为过程日志,再次调试就不需要真的调试执行该程序了
  • Stack (Debugging with GDB) 执行过程中的调用栈相关命令行,比如函数调用层次等
  • Source (Debugging with GDB) 打印出程序的源码,反汇编等信息
  • Data (Debugging with GDB) 打印出变量,内存,寄存器等的值,支持结构体层级信息(挺好的)
  • Optimized Code (Debugging with GDB) 编译器的代码优化关于调试方面的选项
  • Macros (Debugging with GDB) 显示程序中的宏定义等信息
  • Tracepoints (Debugging with GDB) 设置调试的跟踪点功能(某些程序必须实时运行,不能被调试中断下来,用于调试此类程序),运行完后我们查看这些设置的跟踪点的变量值,寄存器等各种信息,实现调试。这其实跟我们直接printf差不多,但是printf更好用,简单明了。
  • Overlays (Debugging with GDB) 被调试程序太大,不能一次性放入目标机的内存,从而分段放入
  • Languages (Debugging with GDB) 关于源码语言的
  • Symbols (Debugging with GDB) 查询被调试程序中的各种符号信息不需要调试对象实际运行起来),比如地址,类型等
  • Altering (Debugging with GDB) 调试时候改变程序的运行,比如让它跳转,返回,调用别的函数等
  • GDB Files (Debugging with GDB) 指定当前调试的文件,更新符号表等
  • Targets (Debugging with GDB) 指定调试目标机
  • Remote Debugging (Debugging with GDB) 启动gdbserver等进行远程调试
  • Configurations (Debugging with GDB) 设置目标机的一些特性
  • Controlling GDB (Debugging with GDB) 控制gdb的和我们的交互体验,进行一些交互方面的设置
  • Extending GDB (Debugging with GDB) gdb的一些语言特性方面的扩展
  • Interpreters (Debugging with GDB) 支持的命令解释器,包括控制台命令解释器(CLI接口),机器接口(MI接口,给IDE用的
  • TUI (Debugging with GDB) gdb的一个文本形式的前端界面交互
  • Emacs (Debugging with GDB) Emacs编辑器使用的相关命令
  • GDB/MI (Debugging with GDB) MI机器接口相关命令(反馈信息总为单行,IDE解析用的),没有CLI命令功能那么全,但是这个MI模式下仍然可以用CLI命令的,解析一下gdb的反馈信息的格式区别就行
  • Annotations (Debugging with GDB) 被MI接口功能取代了
  • JIT Interface (Debugging with GDB) 独立编译动态加载的程序,如何进行调试
  • In-Process Agent (Debugging with GDB) 这个跟上面的调试跟踪点功能有点相似,都是尽量减小对程序的干扰的,这个为了支持多核
  • Command and Variable Index (Debugging with GDB) gdb的所有命令,选项做了一个全局汇总,方便全局搜索,特别方便。

大家知道了gdb的功能分类后,就知道该学习和使用什么命令了,点进去对应的文档,都会有一些例子,还是很容易明白的了,当然,网上也有大量的使用教程,也可以搜来看看,但是可能没这么成体系。

有了上面的整体框架后,我们看看如下的一些参考文章

gdb mi接口命令使用

mi接口给IDE做后端的,mi接口命令介绍,看我这篇博客:gdb mi接口命令入门大全_标biao的博客-CSDN博客

gdb的原理以及如何做IDE后端

看我这篇博客:关于调试器和IDE的一些认识_标biao的博客-CSDN博客_ide调试器

GDB实现原理_标biao的博客-CSDN博客_gdb实现原理

gdbserver实现原理:系统gdb内核调试应用程序断点单步执行调试原理_标biao的博客-CSDN博客_单步调试原理

处理器调试断点原理总结_标biao的博客-CSDN博客

gdb读取程序后符号表信息查询

看我这篇博客:gdb的使用以及命令大全非调试状态直接读取调试信息_标biao的博客-CSDN博客

调试信息内容解析

关于ELF格式文件里面的调试信息解读_标biao的博客-CSDN博客_elf调试

gdb调试qemu虚拟机中的stm32程序

gdb连接qemu调试stm32程序_标biao的博客-CSDN博客_qemu 启动stm32

嵌入式IDE原理 OpenOCD介绍 以及stlink如何连接stm32板子_标biao的博客-CSDN博客_openocd stlink

stm32用gdb mi的应用示例:Topic: STM32 ARM built in GDB simulator | Sysprogs 

更多推荐

gdb入门教程大全(清晰明了)