VS Code 是否有用于 C++ 扩展的内存查看器和/或反汇编器?

问题描述 投票:0回答:4

我正在使用 Visual Studio Code (VS Code) 来调试我的 C++ 程序。我想查看变量地址处的内存,并且还能够查看程序的汇编代码。我正在查看 VS Code,但没有看到此类视图的选项。 我在市场上查了一下,那里没有任何东西。

不确定我是否找对地方了,但是 VS Code 是否存在这些功能?

c++ debugging visual-studio-code
4个回答
61
投票

第一次问这个问题时,反汇编视图和内存查看器都不可用。

2021 年 7 月,发布了反汇编视图,可以通过单击编辑器上下文菜单中的“打开反汇编视图”来打开该视图。通用 C++ 调试器都支持这一点,LLDB 调试器有一个“切换反汇编”命令,效果非常好。

2022 年 2 月,VS Code 中发布了内存视图,可以通过将鼠标悬停在“变量”视图中的变量上来访问该视图。


30
投票

此时(2018年2月),这个功能似乎还没有进入VSCode。但是,可以在 VSCode 调试控制台中使用 -exec 命令来运行 GDB 命令。请参阅 https://code.visualstudio.com/docs/languages/cpp#_gdb-lldb-and-mi-commands-gdblldb

GDB 检查命令“x”以各种格式显示内存。所以在 VSCode 调试控制台中

-exec x/64b 0x74ae70

将从 0x74ae70 开始以十六进制显示 64 个字节。请参阅 https://sourceware.org/gdb/onlinedocs/gdb/Memory.html 了解更多详细信息。


9
投票

当时(2020 年 6 月),VS code 中似乎仍然不存在此功能,链接(也许是您正在寻找的答案)。然而,我们是编码员,我们可以制作自己的功能;)。我对 C++ 相当陌生,所以这段代码可能不是很好,但它有效,这是重要的部分。代码到内存视图:

#include <iostream>
#include<cmath>

namespace mem
{
    std::string IntToHexa(int num)
    { 
        int values[2];
        int rest;
        for(int i = 0; i < 2; i++)
        {
            rest = num % 16;
            if(rest == 0 && num > 0)
            {
                values[i] = num/16;
            }else{
                values[i] = num % 16;
            }
            num -= values[i] * std::pow(16, i);

            if(values[i] > 9)
            {
                values[i] = 65 + values[i] - 10;
            }
        }

        std::string output;
        for(int i = 1; i > -1; i--)
        {
            if(values[i] > 10)
            {
                output += char(values[i]);
            }else{
                output += std::to_string(values[i]);
            }
        }
    return output;
    }

    template<typename POINTER>
    void MemView(POINTER pointer, int length = 10, int lines = 1)
    {
        unsigned char* ptr= (unsigned char*)pointer;
        for(int x = 0; x < lines; x++)
        {
            std::cout << (void*)ptr << "   ";
            for(int i = 0; i < length; i++)
            {
                std::cout << IntToHexa((int)*ptr) << "  ";
                ptr++;
            }
            std::cout << std::endl;
        }
    }
}

那么有些人可能想知道如何使用它。调用 MemView 函数,

MemView(POINTER pointer, int length = 10, int lines = 1)
。第一个参数是一个指针(非函数指针)。接下来是一行中显示的字节数(从一开始设置为 10)。最后一个参数是应该打印多少个 lin(第二个参数设置了这么多字节)(从开始设置为 1)。举个例子!

int main()
{
    int a = 10;
    int* ptr = &a;
    mem::MemView(ptr);
}

输出:

0x7ffee0a7a6ec   0A  00  00  00  00  A7  A7  2E  FE  7F
内存以十六进制写入,这意味着每一对都是一个字节。这是从堆栈中取出的,因此顺序相反。因为 int 是 4 个字节 (0A 00 00 00) 并且是相反的顺序,所以您可以看到 (00 00 00 0A) 的值为 10,即 a 的值。另一个例子!

int main()
{
    int a = 10;
    int* ptr = &a;
    mem::MemView(ptr, 4, 2);
}

输出:

0x7ffee4bec6ec   0A  00  00  00  
0x7ffee4bec6f0   00  C7  BE  E4

现在当第二个参数为4时,每行包含4个字节。因为第三个参数设置为 2,所以有 2 行。在每行的开头,显示指向第一个字节的指针。 (下一行中的第一个字节是第一行中最后一个字节的后续字节)。该程序几乎适用于所有指针类型,例如 int、char、double ...但是它不适用于函数指针(尝试一下,您会得到一个错误)。


9
投票

它即将推出,并在 VSCode 1.59 中提供预览功能(2021 年 7 月)

预览功能:反汇编视图

感谢 C++ 团队贡献的大量代码,我们很高兴在此里程碑中包含反汇编视图的预览。

可以从编辑器的上下文菜单中打开反汇编视图,以显示活动堆栈帧的反汇编源代码,并且它支持单步执行汇编指令并在各个指令上设置断点。

反汇编视图仅在活动调试会话中且底层调试扩展支持时可用。
截至今天,只有“C++”和“Mock Debug”扩展可以提供反汇编视图。

disassembly view in mock debug

从技术角度来看,VS Code 的反汇编视图实现现在支持调试适配器协议的另外四个功能:

  • 提供内存位置的反汇编源的反汇编请求,
  • 堆栈帧上的
    instructionPointerReference
    属性,
  • 步进请求的粒度属性,
  • 指令断点和
    setInstructionBreakpoints
    请求。
© www.soinside.com 2019 - 2024. All rights reserved.