### GDB 使用命令详解 #### 一、简介 GDB(GNU Debugger)是一款强大的调试工具,主要用于调试 C 和 C++ 程序。它能够帮助开发者实现以下四大核心功能: 1. **启动程序**:根据自定义的需求启动程序,允许在特定条件下运行。 2. **设置断点**:使程序在指定位置暂停执行,断点可以基于条件表达式。 3. **检查状态**:当程序暂停时,可以检查程序内部的状态,包括变量值、内存状态等。 4. **改变执行环境**:动态调整程序的运行环境,例如修改变量值或改变程序流。 #### 二、生成调试信息 为了有效利用 GDB,需要在编译时添加调试信息。这通常通过在编译命令中加入 `-g` 参数来实现,例如: - `gcc -g hello.c -o hello` - `g++ -g hello.cpp -o hello` 如果没有使用 `-g` 参数,GDB 将无法显示函数名、变量名等信息,而只显示内存地址。 #### 三、启动 GDB 的方法 GDB 可以通过多种方式启动: 1. **直接启动程序**:`gdb program` 其中 `program` 是要调试的可执行文件。 2. **结合 core 文件调试**:`gdb program core`,其中 `core` 是程序崩溃时产生的 core dump 文件。 3. **调试运行中的进程**:`gdb program PID`,其中 `PID` 是正在运行的服务程序的进程 ID。 #### 四、程序运行上下文 - **设置运行参数**:使用 `set args` 来指定程序运行时的参数,例如 `set args 10 20 30`。 - **显示/设置工作目录**:`cd` 和 `pwd` 命令用于改变或查看当前工作目录。 - **控制输入输出**:`info terminal` 显示终端配置信息;`run > outfile` 将程序输出重定向至 `outfile`;`tty /dev/tty1` 设置输入输出使用的终端设备。 #### 五、设置断点 - **基本断点**:`break` 或 `b` 用于设置断点。例如 `b 10` 表示在第 10 行设置断点;`b func` 表示在 `func` 函数入口处设置断点。 - **多文件断点**:对于多文件项目,可以更精确地指定断点位置,例如 `break filename:linenum` 或 `break filename:function`。 - **查询断点**:使用 `info b` 或 `infob` 命令查看已设置的所有断点。 #### 六、观察点 观察点用于监控变量或表达式的值,一旦发生变化即触发程序暂停: - `watch expr`:表达式 `expr` 的值变化时暂停。 - `rwatch expr`:当 `expr` 被读取时暂停。 - `awatch expr`:当 `expr` 被读取或写入时暂停。 - `info watchpoints`:列出所有观察点。 #### 七、条件断点 条件断点允许程序仅在满足特定条件时才暂停执行: - 设置条件断点:例如 `b test.c:8 if intValue == 5`。 - 修改条件:使用 `condition` 命令可以修改已设置的条件断点的条件。 #### 八、维护停止点 - **删除断点**:使用 `delete` 命令删除单个或多个断点,例如 `delete 1` 删除编号为 1 的断点。 - **禁用/启用断点**:使用 `enable` 和 `disable` 命令可以暂时禁用或重新启用断点。 #### 九、为停止点设定运行命令 - **设置命令**:可以在断点触发时自动执行一组命令,例如 `commands` 和 `end` 命令对可以设置一系列命令。 - **查看命令**:使用 `info commands` 查看某个断点关联的命令。 #### 十、调试代码 - **单步执行**:`next`(n)用于单步执行代码,遇到函数调用时不进入函数内部。 - **逐步深入**:`step`(s)用于单步执行代码,遇到函数调用时会进入函数内部。 - **继续执行**:`continue`(c)命令用于从暂停状态继续执行程序,直到下一个断点或程序结束。 #### 十一、查看运行时数据 - **查看变量**:使用 `print`(p)命令查看变量值。 - **列表显示**:使用 `list`(l)命令查看源代码。 - **查看堆栈信息**:`backtrace`(bt)命令用于查看当前的调用堆栈信息。 #### 十二、程序变量 - **修改变量值**:使用 `set variable` 命令可以修改程序变量的值。 - **查看局部变量**:使用 `info locals` 命令可以查看当前作用域内的局部变量。 #### 十三、自动显示 - **自动显示变量**:使用 `display` 命令可以设置变量的自动显示,每当程序停止时自动打印这些变量的值。 #### 十四、历史记录 - **查看命令历史**:使用 `history` 命令查看已执行过的命令历史记录。 - **重复执行命令**:使用 `!!` 快速重复执行上一条命令。 #### 十五、改变程序的执行 - **修改变量值**:`set variable var=value` 用于修改变量值。 - **跳转执行**:`jump` 命令用于跳转到指定位置执行。 - **产生信号量**:`signal` 命令可以向程序发送特定信号。 - **强制函数返回**:`return` 命令可以强制当前函数立即返回。 - **强制调用函数**:`call` 命令可以强制调用一个函数,并传入参数。 #### 十六、显示源代码 - **查看源代码**:使用 `list`(l)命令可以查看当前源代码。 - **浏览源代码**:使用 `up` 和 `down` 命令可以向上或向下浏览源代码的调用层级。 #### 十七、调试已运行的进程 - **附加进程**:使用 `attach` 命令可以附加到一个已经运行的进程进行调试。 #### 十八、线程 - **查看线程信息**:使用 `info threads` 命令查看当前进程中的线程信息。 - **切换线程**:使用 `thread` 命令可以在不同线程之间切换。 - **设置线程断点**:可以针对特定线程设置断点。 #### 十九、查看栈信息 - **查看调用栈**:使用 `backtrace`(bt)命令查看当前的调用栈信息。 - **查看特定帧**:使用 `frame` 命令查看调用栈中的特定帧信息。 #### 二十、信号 - **查看信号**:使用 `info signals` 命令查看系统支持的信号及其含义。 - **捕获信号**:使用 `catch signal` 命令可以让程序在接收到特定信号时暂停。 #### 二十一、catch 命令 - **捕捉事件**:使用 `catch` 命令可以在特定事件发生时暂停程序,例如 `catch throw` 用于在抛出异常时暂停。 #### 二十二、指定源文件的路径 - **设置源文件路径**:使用 `directory` 命令可以指定查找源文件的路径。 通过上述命令,开发者可以全面掌握 GDB 的使用技巧,有效地进行程序调试。这些命令不仅适用于初学者,也适合经验丰富的开发者进行深入研究。
剩余13页未读,继续阅读
- 粉丝: 5
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip