如何在Visual Studio中读取调试内存窗口

Iva*_*van 7 c++ linux memory-management visual-studio-2010

我之前在Visual Studio中使用过调试模式,但我从来没有使用内存窗口.如果我有一个简单的应用程序计算a = b + c并使b = 8和c = -2,我如何在不使用监视的情况下在内存窗口中找到地址a,b和c及其值?

当我尝试时,我看到了大量的"胡言乱语",我无法理解.这是一个截图:

在此输入图像描述

如果我想做同样的事情,但在Linux环境中,我怎么能做到这一点?

Mar*_*ins 13

在Visual Studio中查找变量地址的一种方法是使用QuickWatch窗口(如果您不知道热键,则在调试菜单下,Ctrl+ Alt+ Q).如果键入&a,它将显示变量的地址a.然后,您可以在内存窗口中输入该地址.或者你可以进入&a内存窗口.

但是要查看内存窗口中的所有变量,它们需要在彼此的几个字节内,因为它显示连续的内存.对于堆栈上的局部变量,这通常不是问题.对于整数变量,通过右键单击内存窗口并更改布局(例如,选择带有符号显示的4字节整数),可以更容易地以可读格式查看它们.

说了这么多,看起来使用监视窗口要简单得多,因为所有内容都已经很好地标记,并且很容易分辨哪个值与哪个变量相关联.


Mal*_*ick 8

我看到了大量的“胡言乱语”:一个小例子可能会有所帮助(特别是对于接下来的读者:)

  1. 复制/粘贴以下代码并调试:

    struct MyStruct
    {
        int age;
        char code_1;
        char code_2;
        char code_3;
    };
    
    int main()
    {
        int int_variable = 65;
    
        int* adresse_int_variable = &int_variable;
    
        int int_variable2 = 10000;
    
        char char_variable_1 = 'A';
    
        char char_variable_2 = 'B';
    
        cout << " sizeof(int_variable) " << sizeof(int_variable) << endl;
        cout << " sizeof(char_variable_1) " << sizeof(char_variable_1) << endl;
    
        MyStruct mystruct;
        mystruct.age = int_variable2;
        mystruct.code_1 = 'A';
        mystruct.code_2 = char_variable_2;
        mystruct.code_3 = int_variable;
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行 Visual Studio 调试器,将监视添加到所有变量(右键单击每个变量并单击“添加监视”)。现在如果它没有打开,打开观察窗口(菜单Debug ? Window ? *Watch),并将变量adresse_int_variable从观察窗口拖放到内存窗口。您将获得以下内容:

    在此处输入图片说明

  3. 您会观察到该值41出现在此地址处。在十六进制中,0x41 等于 65。所以你看到变量的地址int_variable实际上包含 65。(注意实际上内存包含位:01000001,但它以十六进制表示以方便阅读。)

  4. 进入&int_variable2内存窗口,你会得到:

    在此处输入图片说明

    int_variable2保存值10000,并以十六进制表示0x2710。现在查找为变量char_variable_1和存储的值char_variable_2:你看到0x410x42。这是正路A,并B在编码ASCII表。注意在内存中int_variablechar_variable_1是一样的。

  5. 最后进入&mystruct内存窗口,你会看到:

    在此处输入图片说明

    这对应于mystruct变量的内存,其中包含四个变量(一个int和三个chars)。您会看到age变量 ( 10000 = 0x2710) 和以下三个字符:A,B65存储为0x41, 0x42, 0x41(从右到左)。请注意,在窗口的右侧部分,您可以看到ABA内存的字符串表示(如果不是右键单击窗口并单击 ANSI)。

  6. 尝试使用更复杂的变量,阅读有关字节序数据结构对齐的内容。另请参阅MSDN 上内存窗口页面