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

yruzcnhs  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(148)

我正在使用Visual Studio代码(VS代码)调试我的C++程序。我想查看变量地址的内存,也可以查看我的程序的汇编代码。我正在查看VS代码,我没有看到这样的视图的选项。我在市场上检查了一下,我没有任何东西。
不确定我是否找对了地方,但VS代码是否存在这些功能?

ulydmbyx

ulydmbyx1#

第一次提出这个问题时,反汇编视图和内存查看器都不可用。
2021年7月发布了反汇编视图,可以通过点击编辑器上下文菜单中的“打开反汇编视图”来打开,通用C++调试器都支持这一点,LLDB调试器有一个“切换反汇编”命令,效果相当不错。

2022年2月,内存视图在VS Code中发布,可以通过悬停在“Variables”视图中的变量上来访问。目前仅在LLDB C++ debugger中支持此功能。

yzckvree

yzckvree2#

到目前为止(2018年2月),这个功能似乎还没有进入VSCode。但是,可以在VSCode调试控制台中使用-exec命令来运行GDB命令。请参见https://code.visualstudio.com/docs/languages/cpp#_gdb-lldb-and-mi-commands-gdblldb
GDB examine命令“x”以各种格式显示内存。
-exec x/64b 0x74ae70
将显示从0x 74 ae 70开始的64个十六进制字节。有关详细信息,请参阅https://sourceware.org/gdb/onlinedocs/gdb/Memory.html

ruoxqz4g

ruoxqz4g3#

当时(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)。最后一个参数是应该打印多少林斯(从开始处设置为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...然而,它不适用于函数指针(尝试,您将得到错误)。

y1aodyip

y1aodyip4#

VSCode 1.59中的预览功能即将推出(2021年7月)

预览功能:反汇编视图

由于C团队贡献了大量代码,我们很高兴在此里程碑中包含了反汇编视图的预览。
“反汇编”视图可以从编辑器的上下文菜单中打开,以显示活动堆栈帧的反汇编源代码,并且它支持单步执行汇编指令和在各个指令上设置断点。
“反汇编”视图仅在活动调试会话中以及基础调试扩展支持时可用。
到目前为止,只有“C
”和“Mock Debug”扩展可以提供“反汇编”视图。

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

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

相关问题