Visual Studio Debugger - 通过调试器访问编译器生成的临时变量的任何方法?

时间:2014-02-05 17:11:06

标签: c# visual-studio debugging compiler-construction

如果检查Reflector中的C#代码,您可以注意到使用模式CS $ X $ Y命名的特殊编译器生成的局部变量。这些变量(非正式地)记录在this answer中。

有没有办法通过Visual Studio中的Watch窗口或VS Debugger Extensibility API查看这些值?

我特意询问常规的Visual Studio调试器,请不要回答这可能是通过windbg / sos / sosex - 因为那不是我正在寻找的。

2 个答案:

答案 0 :(得分:32)

不幸的是,没有办法用C#EE做到这一点。这些本地人的名字确实存储在PDB中并且可用。但是,C#EE将在调试期间过滤掉所有临时值以减少混乱。此过滤是无条件的,无法覆盖。 C#并不孤单,因为这是每种语言的行为。

然而,好消息是每种语言都为他们的临时使用不同的命名模式。这意味着C#中的临时名称将在VB EE的过滤之后运行。即使它是非法标识符,VB EE仍然认为它是有效的本地(反之亦然)。因此,您只需要暂时将C#代码的调试引擎切换到VB EE,本地将变为可见

以下是如何执行此操作

  • 关闭所有Visual Studio实例(这非常重要)
  • 打开regedit
  • 导航至HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\AD7Metrics\ExpressionEvaluator\{3F5162F8-07C6-11D3-9053-00C04FA302A1}\{994B45C4-E6E9-11D2-903F-00C04FA302A1}
  • 将CLSID的值从{60F5556F-7EBC-4992-8E83-E9B49187FDE3}更改为{59924502-559A-4BB1-B995-5D511BB218CD}

现在无论何时调试C#代码,它都将使用VB EE,因此将临时值显示为普通本地。请注意,这是完全不受支持的。但它应该工作正常。我能够在我的机器上看到这个技巧的原始闭包值并且没有任何问题地捅了一下。

请注意,这些说明特定于Visual Studio 2013.如果您使用的是2012或2010,则应将注册表项名称中的12.0_Config更改为

  • 2012使用11.0_Config
  • 2010使用10.0_Config

可能需要进行一些调整(实际上没有测试旧版本)。如果您遇到任何问题,请告诉我,我会尝试让它在本地工作并更新说明

这是您进行此更改后最终输出的图片

enter image description here

答案 1 :(得分:2)

不,它们未添加到PDB文件中。调试器根本无法发现它们,也不知道存储它们的位置。这完全是故意的。