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

Ome*_*viv 13 c# compiler-construction debugging visual-studio

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

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

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

Jar*_*Par 32

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

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

这是怎么做的

  • 关闭Visual Studio的所有实例(这非常重要)
  • 打开注册表
  • 导航 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

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

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

在此输入图像描述

  • 尼斯.黑客!:) (3认同)