Day4 :拒绝Printf调试!VS Code + GDB 优雅解决段错误与内存泄漏

「C++ 40 周年」主题征文大赛(有机会与C++之父现场交流!) 10w+人浏览 737人参与

前言

搞机器人,C++ 是绕不过去的大山。之前写代码遇到 Bug,我只会疯狂地 cout << "here 111" << endl,效率极低且不优雅。

今天深入学习了 GDB 调试内存模型,终于学会了如何在 VS Code 里开启“上帝视角”,像看慢动作电影一样观察代码的执行。这篇笔记记录了我的环境配置过程和踩过的坑,希望能帮到同样在学 C++ 的你。

一、 理论基础:你的变量存在哪?

1. 栈 (Stack) —— 自动管理的“书桌”

  • 特点:快,但空间小。

  • 用途:存储局部变量、函数参数。函数结束自动释放。

  • 例子int a = 10;

2. 堆 (Heap) —— 手动管理的“仓库”

  • 特点:空间大,但需要手动申请和释放。

  • 用途:存储大型数据(如图像、点云)。

  • 风险内存泄漏 (Memory Leak)。如果你 new 了一块内存却忘了 delete,这块内存就被“吃”掉了。

二、 实战演练:制造“案发现场”

为了测试 GDB 的威力,我特意写了两段“有毒”的代码。

1. 模拟崩溃 (Crash)

文件名:src/debug_practice.cpp

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int b = 0;
    
    cout << "准备进行除法..." << endl;
    
    // 【致命错误】除以 0,程序会在这里直接崩溃 (Segmentation Fault / Floating point exception)
    int c = a / b; 
    
    cout << "结果是: " << c << endl;
    return 0;
}

2. CMake 配置 (开启调试模式)

关键点:必须添加 set(CMAKE_BUILD_TYPE Debug),否则 GDB 无法读取源代码行号。

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(Day6Debug)

# 【关键】开启 Debug 模式,带上调试符号信息
set(CMAKE_BUILD_TYPE Debug)

set(CMAKE_CXX_STANDARD 14)

add_executable(debug_crash src/debug_practice.cpp)

三、 VS Code 可视化调试配置

这是最容易踩坑的地方!很多人点击调试按钮报错,就是因为配置文件没写对。

1. 生成 launch.json

点击左侧调试图标 -> "create a launch.json file" -> 选择 "C++ (GDB/LLDB)"。

2. 配置详情 (避坑版)

重点注意 program 字段:必须指向 CMake 编译生成的可执行文件,而不是你的源代码!

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            // 【坑点】这里的路径必须和 CMakeLists.txt 里 add_executable 生成的名字完全一致!
            "program": "${workspaceFolder}/build/debug_crash",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

四、 调试效果展示

配置成功后,按下 F5

  1. 断点生效:程序乖乖停在了我打红点的那一行(黄色高亮)。

  2. 变量监视:左侧 Locals 窗口直接显示了 a=10, b=0

  3. 单步执行:我可以点击单步跳过,看着程序一步步走向崩溃的边缘,精准定位 Bug。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值