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

时间:2016-07-24 21:49:02

标签: c++ debugging visual-studio-code

我使用Visual Studio Code(VS Code)来调试我的C ++程序。我想在变量的地址查看内存,也可以查看程序的汇编代码。我正在环顾VS Code,我没有看到这样的观点的选项。我在市场上检查过,我什么都没有。

不确定我是否找不到合适的位置,但VS Code是否存在这些功能?

谢谢!

4 个答案:

答案 0 :(得分:8)

我几天来一直在挖掘这些功能。不幸的是,它似乎目前无法使用。

除了没有内存查看器之外,它看起来像VS Code"调试器控制台"它只是GDB的一个简单包装器,也不允许内存检查命令。

现在有memory viewerdissasembly功能的功能请求。如果你对我们感兴趣,我建议你进行投票。

答案 1 :(得分:6)

此时(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

答案 2 :(得分:5)

当时(2020 年 6 月),VS 代码中似乎还没有此功能,link (and maybe the answer you are looking for)。但是,我们是编码员,我们可以制作自己的功能;)。我对 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)。最后一个参数是应该打印多少 lins(第二个参数设置了这么多字节)(从开始设置为 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 ......但是它不适用于函数指针(尝试你会得到一个错误)。

答案 3 :(得分:1)

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

<块引用>

Preview feature: Disassembly View

<块引用>

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

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

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

disassembly view in mock debug

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

  • 为内存位置提供反汇编源代码的反汇编请求,
  • 堆栈帧上的 instructionPointerReference 属性,
  • 步进请求的粒度属性,
  • 指令断点和 setInstructionBreakpoints 请求。