text
当我使用 Visual Studio 的内存窗口检查一个字符串变量时,我可以看到它的值:
出于好奇,有没有办法检查(也在内存窗口中)该值被引用的位置?
(当然,我已经可以看到内存位置的地址。我之所以这么问,是因为我很好奇 CLR 如何表示并与类类型实例一起工作。根据 CLI 规范的规定,我假设 CLR 表示它们至少作为指针、类型标记和值的组合。我在上面看到后两者,但希望看到指针,以及与它一起存储的其他内容。)
text
当我使用 Visual Studio 的内存窗口检查一个字符串变量时,我可以看到它的值:
出于好奇,有没有办法检查(也在内存窗口中)该值被引用的位置?
(当然,我已经可以看到内存位置的地址。我之所以这么问,是因为我很好奇 CLR 如何表示并与类类型实例一起工作。根据 CLI 规范的规定,我假设 CLR 表示它们至少作为指针、类型标记和值的组合。我在上面看到后两者,但希望看到指针,以及与它一起存储的其他内容。)
一般来说,不只是一个位置,特别是因为这是一个实习字符串。但是您确实有一个,因为您知道text变量指向字符串。因此,使用 address-of 运算符来获取引用的地址,&text
在 Address 框中键入。
您可能想让它更易于识别,右键单击内存窗口并选择“8 字节整数”。你会看到 000000000256D08。您正在查看的内存区域是主线程的堆栈。
请注意,这有点学术性。这是有效的,因为您正在使用调试器并且禁用了抖动优化器。在优化的程序中,该指针值将存储在 cpu 寄存器中。在您的测试方法的特定情况下,没有什么可看的,因为赋值语句将被优化掉。
您可以使用 Release build 和 Tools + Options,Debugging,General,取消选中“Suppress JIT optimization”选项来查看“真实”代码。请注意,它会使调试器变得愚蠢,它不再对局部变量了解太多。然后最重要的调试窗口是 Debug + Windows + Disassembly 来查看代码和 Debug + Windows + Registers 来查看 CPU 寄存器。右键单击后一个窗口并勾选 SSE2 以便您可以看到 XMM 寄存器,x64 抖动喜欢使用它们。