GDB调试打印Vector和Array

std::vector类型变量vector的打印方式:

p *(vector._M_impl._M_start)@vector.size()

std::array类型变量values_的打印方式:

p *values_.data_.get()@values_.size()

最开始学习gdb时一直没找到打印这两种类型变量的方式,作为一个C++
小白也是尝试了很久,分享给大家希望能有帮助。

### 解决方案 要在 VS Code 中通过 GDB 调试 C++ 并查看 STL 容器的内容,可以按照以下配置实现。 #### 1. 启用 GDB 的 Pretty Printing 功能 GDB 提供了一个名为 `pretty-printing` 的功能,用于美化 STL 容器的输出。为了启用此功能,在 `.gdbinit` 文件中加入如下内容: ```plaintext set print pretty on python import sys; sys.path.insert(0, '/path/to/gdb/python') python from libstdcxx.v6.printers import register_libstdcxx_printers; register_libstdcxx_printers(None) ``` 上述代码的作用是加载 Python 脚本以支持 STL 容器的漂亮打印[^1]。其中 `/path/to/gdb/python` 是 GDB 自带的 Python 脚本路径,通常位于安装目录下的 `share/gcc-x.y.z/python/` 或类似的子文件夹中。 #### 2. 配置 VS Code 的 launch.json 文件 在 VS Code 中调试时,需要修改项目的 `launch.json` 文件以适配 GDB 其扩展功能。以下是典型的配置示例: ```json { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/main.out", // 替换为目标可执行程序路径 "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb", // 替换为实际的 gdb 可执行文件路径 "setupCommands": [ { "description": "Enable pretty printing", "text": "-enable-pretty-printing" }, { "description": "Set Disassembly Flavor to Intel", "text": "set disassembly-flavor intel" } ], "preLaunchTask": "build" // 如果有预编译任务,则在此处定义 } ] } ``` 这段 JSON 配置的关键部分在于 `"setupCommands"` 字段,它启用了 `-enable-pretty-printing` 命令来激活 GDB 的美化打印功能。 #### 3. 下载并应用 MinGW 工具链(适用于 Windows 用户) 如果运行环境是在 Windows 上,可能需要下载特定版本的 MinGW 工具链以兼容 STL 容器的调试需求。推荐使用的工具链可以从以下链接获取:x86_64-13.2.0-release-win32-seh-msvcrt-rt_v11-rev0.zip[^2]。解压后将其 bin 目录添加到系统的 PATH 环境变量中,并确保 VS Code 使用该工具链中的 GCC 编译器 GDB 调试器。 #### 4. 手动检查容器内容的方法 当某些情况下自动化的 pretty-printer 不起作用时,可以通过手动方式检查 STL 容器的具体数据项。例如: - 对于数组或向量,可以直接使用类似 `(int(*)[n])array_name` 的语法访问前 n 个元素[^3]。 - 对于字符串或其他复杂结构体,可以在 GDB 控制台输入 `print container_variable` 来尝试解析其内部存储的数据。 --- ### 示例代码片段 假设有一个简单的 C++ 程序如下所示: ```cpp #include <vector> #include <string> using namespace std; int main() { vector<int> vec = {1, 2, 3, 4}; string str = "hello world"; return 0; } ``` 完成以上配置之后,在断点位置暂停时即可看到类似于下面的结果: ``` vec = {size=4} = {1, 2, 3, 4} str = "hello world" ``` 这表明 STL 容器已经能够被正常解析并显示了。 --- ### 注意事项 - 确保所使用的 GDB 版本较新,因为旧版可能存在不完全支持 pretty-printing 的情况。 - 若仍然遇到问题,请验证 `.gdbinit` 是否正确加载以及 Python 路径是否指向有效的脚本集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值