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

Posted

技术标签:

【中文标题】VS Code 是不是有用于 C++ 扩展的内存查看器和/或反汇编器?【英文标题】:Does VS Code have a memory viewer and/or a disassembler for C++ extension?VS Code 是否有用于 C++ 扩展的内存查看器和/或反汇编器? 【发布时间】:2016-11-28 04:06:05 【问题描述】:

我正在使用 Visual Studio Code (VS Code) 来调试我的 C++ 程序。我想查看变量地址处的内存,也可以查看我的程序的汇编代码。我在 VS Code 上环顾四周,但没有看到此类视图的选项。我在市场上查了一下,没有任何东西。

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

谢谢!

【问题讨论】:

【参考方案1】:

它来了,在 VSCode 1.59(2021 年 7 月)中带有预览功能

Preview feature: Disassembly View

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

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

反汇编视图仅在活动调试会话中以及底层调试扩展支持时可用。 到目前为止,只有“C++”和“Mock Debug”扩展可以提供反汇编视图。

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

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

【讨论】:

嗨,我可以在反汇编视图中进行上下文突出显示吗?非常感谢~~ @Shore 我不知道。这可能是一个很好的功能请求。【参考方案2】:

当时(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】:

我这几天一直在研究这些功能。不幸的是,它似乎目前不可用。

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

现在有memory viewer 和dissasembly 功能的功能请求。如果你和我一样对它们感兴趣,我建议你投票。

【讨论】:

啊,真可惜。令人惊讶的是,似乎还没有人提出这个建议?感谢打开。我投票了。我还在这里打开了一个内联汇编视图的请求:visualstudio.uservoice.com/forums/293070-visual-studio-code/… 我认为新的投票地点是here 反汇编视图已在几个月前发布。跟踪 2021 年 11 月里程碑的内存查看器:github.com/microsoft/vscode/issues/126268【参考方案4】:

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

【讨论】:

-exec x/64xb 0x55555556aeb0 现在就足够了。谢谢。

以上是关于VS Code 是不是有用于 C++ 扩展的内存查看器和/或反汇编器?的主要内容,如果未能解决你的问题,请参考以下文章

vs.code调试node.js的C++扩展

VS Code Code Runner 不适用于 virtualenvs

VS code的安装

C++ New vs Malloc 用于对象的动态内存数组

VS Code 扩展巡礼 - phpcs:提升 PHP 编码规范

ubuntu(Linux)安装Vs code并配置c++编译及cmake多文件编译