GDB调试C++的new对象

本文介绍了一个简单的C++ Chunk类实现,该类用于内存管理。通过构造函数初始化Chunk大小,并提供了获取Chunk底部、顶部地址及长度的方法。此外,还展示了如何使用g++编译并借助gdb进行调试的过程。

源码

Chunk.hpp

#include "stddef.h"
class Chunk{
private:
    Chunk*       _next;     // Next Chunk in list
    const long _len;      // Size of this Chunk
public:
    Chunk(long length):_len(length){
        _next = NULL;
    }
    char* bottom() const          { return ((char*) this) + sizeof(Chunk);  }
    char* top()    const          { return bottom() + _len; }
    long  len()    const          { return _len; }
};

main.cpp

#include "Chunk.hpp"
#include <iostream>
int main(void){
    Chunk *chunk = new Chunk(32);
    std::cout<<chunk->len()<<std::endl;
    std::cout<<chunk->bottom()<<std::endl;
    std::cout<<chunk->top()<<std::endl;
}

调试

使用下面命令生成可调式的可执行程序

g++ Chunk.hpp main.cpp -g

用gdb打开

gdb ./a.out

在gdb调试界面

(gdb) b main
Breakpoint 1 at 0x400850: file main.cpp, line 4.
(gdb) r
Starting program: /home/firewood/src/cpp/Chunk/a.out 

Breakpoint 1, main () at main.cpp:4
4           Chunk *chunk = new Chunk(32);
(gdb) print chunk
$1 = (Chunk *) 0x400760 <_start>

如果要看chunk的成员变量的地址

(gdb) print *chunk
$2 = {_next = 0x89485ed18949ed31, _len = 5283937258368616674}

如果要看_next的地址

(gdb) print &(chunk->_len)
$8 = (const long *) 0x613e78
(gdb) print &(chunk->_next)
$9 = (Chunk **) 0x613e70
(gdb) 

如果要看_len的值

(gdb) x/g 0x613e78
0x613e78:       32

vscode 环境调试

首先建立远程C++调试连接环境,网上方法一堆,此处不表

配置vscode环境文件

在这里插入图片描述

vscode会创建调试配置文件

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ 生成活动文件",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

打断点

在这里插入图片描述

然后启动调试即可

在这里插入图片描述

<think>好的,我需要帮助用户了解如何在Sublime Text中使用SublimeGDB插件进行图形化调试C++程序。首先,我需要回忆之前提供的引用内容,看看有没有相关的步骤或配置方法。引用3提到了安装MinGW和SublimeGDB,引用4提到了在VS Code和emacs中有调试功能,而引用5是关于M1 Mac使用Terminus和Debugger插件的配置,可能不太相关。引用1和2是关于配置GDB的基础,可能涉及如何保存配置文件。 首先,用户需要安装SublimeGDB插件。我应该先指导他们通过Package Control安装。然后,确保已经安装了GDB调试器,这可能属于MinGW的一部分,需要检查用户的环境变量是否正确配置。 接下来是配置SublimeGDB。可能需要修改Sublime Text的配置文件,比如设置调试命令和路径。引用2中的例子是保存gdb_c.sublime-build文件,但这里可能需要针对C++进行调整,比如使用g++编译并生成调试信息,使用-g选项。 然后,用户需要设置断点,启动调试会话。这部分需要说明如何在代码行号旁点击设置断点,然后通过SublimeGDB的菜单启动调试调试过程中,用户可能需要查看变量、调用堆栈和控制执行流程,比如单步执行。 可能的问题包括路径错误、GDB未正确安装或者编译选项缺少调试信息。需要提醒用户检查这些方面,并确保编译时加入-g参数。 最后,生成相关问题,比如优化调试体验、处理多文件项目或替代方案如VS Code的配置。确保问题与当前主题相关,帮助用户扩展知识。 现在整理步骤,确保逻辑清晰,语言简洁,符合用户的实际操作流程。同时,参考之前的引用内容,特别是引用3中的配置步骤,可能需要详细说明配置文件的参数。还要注意中英文术语的正确使用,比如“断点”是breakpoint,“单步执行”是step into等。</think>### Sublime Text使用SublimeGDB调试C++程序教程 #### 一、环境准备 1. **安装GDB调试器** 确保已安装MinGW或Cygwin(Windows)或GCC套件(Linux/macOS),并配置好`g++`和`gdb`命令的环境变量[^3]。 - Windows用户可通过MinGW安装:`pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb` - 验证安装:终端输入`gdb --version`应返回版本信息。 2. **安装SublimeGDB插件** - 在Sublime Text中按`Ctrl+Shift+P`打开命令面板,输入`Install Package`,搜索`SublimeGDB`并安装。 --- #### 二、配置调试环境 1. **创建编译配置** 新建文件并粘贴以下内容,保存为`g++_debug.sublime-build`(路径:`Tools > Build System > New Build System`): ```json { "cmd": ["g++", "-g", "${file}", "-o", "${file_path}/${file_base_name}"], "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", "working_dir": "${file_path}", "selector": "source.c++, source.cpp", "variants": [ { "name": "Run", "cmd": ["cmd", "/c", "start", "${file_base_name}.exe"] } ] } ``` 2. **配置SublimeGDB** - 打开`Preferences > Package Settings > SublimeGDB > Settings`,修改配置: ```json { "workingdir": "${file_path}", "command": "gdb", "target": "${file_path}/${file_base_name}.exe", "autorun": ["break main", "run"] } ``` --- #### 三、调试流程 1. **编译程序** - 按`Ctrl+B`选择`g++_debug`编译,生成带调试信息的可执行文件(`-g`选项关键)[^2]。 2. **启动调试** - 设置断点:点击代码行号左侧区域添加断点(红色圆点)。 - 按`Ctrl+Shift+G`启动SublimeGDB,底部面板显示调试控制台。 3. **调试操作** - **控制流**:`Step Over (F10)`, `Step Into (F11)`, `Continue (F5)`。 - **变量查看**:鼠标悬停变量或展开调试面板的`Locals`列表。 - **调用栈**:在`Stack`面板查看函数调用链。 --- #### 四、常见问题解决 | 问题现象 | 解决方案 | |---------------------------|--------------------------------------------------------------------------| | "gdb not found" | 检查GDB是否安装且环境变量配置正确[^3] | | 断点未命中 | 确保编译时添加`-g`选项,且代码未被优化(避免`-O2`编译参数)[^2] | | 调试输出乱码 | 在SublimeGDB配置中设置`"encoding": "utf-8"` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值