GDB配置(打印STL容器、VS code配置、远程调试debug)

本文介绍了如何配置GDB以更好地调试C++项目,特别是STL容器的打印,详细讲解了如何配置pretty printer,以及在VS Code中使用GDB。此外,还分享了如何进行gdb + gdbserver远程调试,并提供了优化调试过程的技巧,如调试信息级别设置和scp文件优化。最后提到了GDB的一些实用配置,如命令历史保存和断点管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


0.前言

  Linux开发必须要把gdb玩的666呀,建议先阅读下《C++ vector STL实现详解》。gdb玩的666可以摆脱调试中各种使用std::cout打印输出变量的恶习,尤其对于大型项目,每次调试都需要增加std::cout,单单编译时长都能让你发狂,严重影响开发效率。

1.gdb定义打印函数

  gdb原生支持定义打印函数,了解类型后,可以自行定制打印函数。目前网上有提供针对stl标准容器的现成文件.gdbinit,该文件会定义string、vector、map、set、deque、priority_queue等等,需要可以直接下载这里, 把文件保存为.gdbinit, 放在用户目录下~/.gdbinit,每次执行gdb调试会自动加载.gdbinit初始文件。

文件中vector定义如下

define pvector
    if $argc == 0
        help pvector
    else
        set $size = $arg0._M_impl._M_finish - $arg0._M_impl._M_start
        set $capacity = $arg0._M_impl._M_end_of_storage - $arg0._M_impl._M_start
        set $size_max = $size - 1
    end
    if $argc == 1
        set $i = 0
        while $i < $size
            printf "elem[%u]: ", $i
            p *($arg0._M_impl._M_start + $i)
            set $i++
        end
    end
    if $argc == 2
        set $idx = $arg1
        if $idx < 0 || $idx > $size_max
            printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max
        else
            printf "elem[%u]: ", $idx
            p *($arg0._M_impl._M_start + $idx)
        end
    end
    if $argc == 3
      set $start_idx = $arg1
      set $stop_idx = $arg2
      if $start_idx > $stop_idx
        set $tmp_idx = $start_idx
        set $start_idx = $stop_idx
        set $stop_
### 解决 VSCode 中 C++ STL 容器头文件报错的方法 在处理VSCode中C++编程遇到STL容器头文件报错的情况时,通常是因为开发环境未能正确识别标准库路径或编译器配置不完善。为了确保能够顺利使用STL容器并消除这些错误提示,需按照如下建议操作: #### 配置 `tasks.json` 和 `launch.json` 对于VSCode中的C/C++项目来说,合理配置`.vscode/tasks.json`以及`.vscode/launch.json`至关重要。这两个JSON文件分别用于定义构建任务和调试配置- **创建 `.vscode` 文件夹**:通过按下 Ctrl+Shift+p 并选择 "Tasks: Configure Task" 或者 "Debug: Open launch.json"[^2]。 - **编辑 `tasks.json`**:此文件应包含指定使用的编译器及其参数的信息。例如,当采用 g++ 编译时,可参照以下模板编写: ```json { "version": "2.0.0", "tasks": [ { "label": "build hello world", "type": "shell", "command": "g++", "args": [ "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"], "detail": "Generated task to build a single file." } ] } ``` - **调整 `launch.json`**:该文件负责设定程序运行方式及传递给调试器的相关选项。一个典型的例子如下所示: ```json { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/a.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "/path/to/gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build hello world", "internalConsoleOptions": "openOnSessionStart" } ] } ``` #### 设置 IntelliSense 的 include 路径 IntelliSense 是 Visual Studio Code 提供的一种智能感知功能,在编写代码过程中提供自动补全等功能。要让其正常工作于C++环境中,则需要告知它去哪里查找必要的头文件。 可以通过修改 `.vscode/c_cpp_properties.json` 来实现这一点。具体做法是在其中加入 MinGW 或其他所选工具链的标准库位置作为 include path 成员之一。比如针对MinGW-w64而言,可能是这样的形式: ```json { "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**", "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++", "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32", "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward", "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/x86_64-w64-mingw32/include" ], ... } ], ... } ``` 上述路径应当根据实际安装情况作出相应更改[^4]。 #### 更新扩展插件 确保已安装最新版的 Microsoft C/C++ Extension Pack 插件集,并保持更新状态。这组插件提供了对多种主流编译系统的支持,有助于改善IDE体验并减少潜在问题的发生概率。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值