9

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

当我尝试时,我看到了大量我无法理解的“胡言乱语”。这是一个屏幕截图:

在此处输入图像描述

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

4

4 回答 4

16

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

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

说了这么多,使用监视窗口似乎要简单得多,因为一切都已经很好地标记了,并且很容易分辨哪个值与哪个变量相关联。

于 2012-09-17T23:05:38.393 回答
9

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

  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;
    }
    
  2. 运行 Visual Studio 调试器,将监视添加到所有变量(右键单击每个变量并单击“添加监视”)。现在如果它没有打开,打开监视窗口(菜单DebugWindowadresse_int_variable → *Watch),然后将变量从监视窗口拖放到内存窗口。您将获得以下内容:

    在此处输入图像描述

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

  4. 在内存窗口中输入&int_variable2,你会得到:

    在此处输入图像描述

    int_variable2保存该值10000,并且以十六进制表示0x2710。现在查找为变量char_variable_1和存储的值char_variable_2:您会看到0x410x42。这是在ASCII 表AB编码的方式。注意在内存中和都是一样的。int_variablechar_variable_1

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

    在此处输入图像描述

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

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

于 2017-08-30T20:17:57.050 回答
0

尝试使用 char * 并在“内存”窗口中打开其地址。解释它的输出会更简单。至于Linux环境,我猜你可以在GDB上使用这个教程:http ://www.ofb.net/gnu/gdb/gdb_56.html

时不时看到这样的东西很有趣:)

于 2012-09-17T23:06:42.267 回答
0

我必须查看反汇编代码并找出寄存器的值。

于 2012-10-19T01:51:35.213 回答