【问题标题】:Visual Studio's Memory window: Inspecting a reference instead of the referenced value?Visual Studio 内存窗口:检查引用而不是引用的值?
【发布时间】:2013-06-14 07:01:57
【问题描述】:

当我使用 Visual Studio 的 Memory 窗口检查字符串变量 text 时,我可以看到它的值:

出于好奇,有没有办法检查(也在内存窗口中)该值被引用的位置?

(当然,我已经可以看到内存位置的地址。我之所以这么问,是因为我很好奇 CLR 如何表示并使用类类型实例。根据 CLI 规范的规定,我假设CLR 至少将它们表示为指针、类型标记和值的组合。我在上面看到了后两者,但希望看到指针,以及可能与它一起存储的其他内容。)

【问题讨论】:

    标签: visual-studio clr visual-studio-debugging internals


    【解决方案1】:

    通常不只有一个位置,尤其是因为这是一个内部字符串。但是您确实有一个,因为您知道 text 变量指向字符串。所以使用 address-of 运算符来获取引用的地址,在 Address 框中输入 &text

    您可能希望使其更易于识别,右键单击“内存”窗口并选择“8 字节整数”。你会看到 000000000256D08。您正在查看的内存区域是主线程的堆栈。

    请注意,这有点学术性。这是有效的,因为您正在使用调试器并且禁用了抖动优化器。在优化的程序中,该指针值将存储在 cpu 寄存器中。在您的测试方法的特定情况下,没有什么可看的,因为赋值语句将被优化掉。

    你可以通过Release build和Tools + Options,Debugging,General,取消勾选“Suppress JIT optimization”选项看到“真实”的代码。请注意,它会使调试器变得愚蠢,它不再对局部变量了解太多。然后最重要的调试窗口是 Debug + Windows + Disassembly 来查看代码和 Debug + Windows + Registers 来查看 CPU 寄存器。右键单击后一个窗口并勾选 SSE2 以便您可以看到 XMM 寄存器,x64 抖动喜欢使用它们。

    【讨论】:

    • &text 正是我想要的,但在“地址”框中输入此内容时出现“无法计算表达式” 错误。 (顺便说一句,我在该项目的设置中启用了unsafe 代码。)知道这可能是什么原因吗?
    • 不,我不知道是什么原因造成的。一直为我工作,尝试修改工具 + 选项中的调试选项。
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多