gdb介绍
gdb只是众多调试器中的一个,但是它是用得最多的,所以有必要了解一下。
gdb和gcc一样,都属于gnu开源家族工具链,所以gdb对gcc编译后的程序的调试支持最好。
学习一个工具,当然得先去看它官网,了解清楚整个脉络。
官网:https://www.sourceware.org/gdb/
我们这里关注如何使用,所以进入它的在线文档网站: https://sourceware.org/gdb/current/onlinedocs/gdb/
(可能大家通过别的链接进入的网站跟这个不一样,那是因为这个gdb网站服务器里有多个版本的文档仓库,而官网这里进去的,总是最新的版本的文档)
还给了个pdf文档:https://sourceware.org/gdb/current/onlinedocs/gdb.pdf 这个就是在线文档内容搬过来的,内容和结构基本一样,喜欢看pdf的可以看这个。
gdb的调试方式和概念
gdb调试的方式主要有本地调试和远程调试
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的功能分类后,就知道该学习和使用什么命令了,点进去对应的文档,都会有一些例子,还是很容易明白的了,当然,网上也有大量的使用教程,也可以搜来看看,但是可能没这么成体系。