我之前在 Visual Studio 中使用过调试模式,但我从来没有使用过内存窗口。如果我有一个简单的应用程序计算 a=b+c 并使 b =8 和 c=-2,我如何在不使用手表的情况下找到内存窗口中的地址 a、b 和 c 及其值?
当我尝试时,我看到了大量我无法理解的“胡言乱语”。这是一个屏幕截图:
如果我想做同样的事情,但在 Linux 环境中,我怎么能做到这一点?
我之前在 Visual Studio 中使用过调试模式,但我从来没有使用过内存窗口。如果我有一个简单的应用程序计算 a=b+c 并使 b =8 和 c=-2,我如何在不使用手表的情况下找到内存窗口中的地址 a、b 和 c 及其值?
当我尝试时,我看到了大量我无法理解的“胡言乱语”。这是一个屏幕截图:
如果我想做同样的事情,但在 Linux 环境中,我怎么能做到这一点?
在 Visual Studio 中查找变量地址的一种方法是使用 QuickWatch 窗口(如果您不知道热键,则在调试菜单下,Ctrl++ Alt)Q。如果键入&a
,它将显示变量的地址a
。然后,您可以在内存窗口中输入该地址。或者你可以直接进入&a
内存窗口。
但是要在内存窗口中查看所有变量,它们需要彼此相距几个字节,因为它显示了连续的内存。对于堆栈上的局部变量,这通常不是问题。对于整数变量,您可以通过右键单击内存窗口并更改布局(例如,选择带符号显示的 4 字节整数)来更轻松地以可读格式查看它们。
说了这么多,使用监视窗口似乎要简单得多,因为一切都已经很好地标记了,并且很容易分辨哪个值与哪个变量相关联。
我看到了大量的“胡言乱语”:一个小例子可能会有所帮助(尤其是对于下一个读者:)
复制/粘贴以下代码并进行调试:
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;
}
运行 Visual Studio 调试器,将监视添加到所有变量(右键单击每个变量并单击“添加监视”)。现在如果它没有打开,打开监视窗口(菜单Debug → Windowadresse_int_variable
→ *Watch),然后将变量从监视窗口拖放到内存窗口。您将获得以下内容:
您会观察到该值41
出现在此地址。在十六进制中,0x41 等于 65。所以你看到变量的地址int_variable
实际上包含 65。(请注意,实际上内存包含位:01000001,但它以十六进制表示以方便阅读。)
在内存窗口中输入&int_variable2
,你会得到:
int_variable2
保存该值10000
,并且以十六进制表示0x2710
。现在查找为变量char_variable_1
和存储的值char_variable_2
:您会看到0x41
和0x42
。这是在ASCII 表A
中B
编码的方式。注意在内存中和都是一样的。int_variable
char_variable_1
最后进入&mystruct
内存窗口,你会看到:
这对应于mystruct
变量的内存,它保存四个变量(anint
和三个char
s)。您会看到age
变量 ( 10000 = 0x2710
) 和以下三个字符:A
,B
和65
存储为0x41
, 0x42
, 0x41
(从右到左)。请注意,在窗口的右侧,您可以看到ABA
内存的字符串表示形式(如果不是右键单击窗口并单击 ANSI)。
尝试使用更复杂的变量,阅读有关字节序和数据结构对齐的信息。另请参阅MSDN 上的内存窗口页面。
尝试使用 char * 并在“内存”窗口中打开其地址。解释它的输出会更简单。至于Linux环境,我猜你可以在GDB上使用这个教程:http ://www.ofb.net/gnu/gdb/gdb_56.html
时不时看到这样的东西很有趣:)
我必须查看反汇编代码并找出寄存器的值。