【问题标题】:Cannot step into .NET framework source code无法进入 .NET 框架源代码
【发布时间】:2014-12-26 09:04:23
【问题描述】:

我正在使用 Visual Studio 2013 并且有一个 .NET 4.5.2 项目。我已经根据以下页面设置了我的设置:

http://referencesource.microsoft.com/setup.html

通过此设置,我可以看到所有必要的符号都已下载并加载,但我无法进入如下代码:

var cookieContainer = new System.Net.CookieContainer();

我收到来源不可用消息。

我可以单步执行以下代码:

Console.WriteLine("test");

您知道为什么我可以从 mscorlib.dll 单步执行代码,但不能从 System.dll 单步执行代码吗?

【问题讨论】:

  • 上次我遇到同样的问题时,清理符号缓存对我很有帮助。即使 VS 显示为 .net 模块加载了符号,单步执行功能也不起作用。尝试清理缓存并让 VS 重新加载新符号:Tools->Options->Debugging->Symbols->Empty Symbol Cache

标签: c# .net debugging reference-source


【解决方案1】:

并拥有一个 .NET 4.5.2 项目

版本号是你的问题。这是参考源的一个普遍问题,微软没有保持更新到足以为新框架版本提供源。更麻烦的是,安全性和稳定性更新。从事此工作的人很清楚这个问题,他们在他们的演示文稿中指出这是一个问题,但它目前并一直具有 // 待办事项的状态。

这是你可以想象的东西,首先从你的符号缓存中删除 System.pdb(MicrosoftPublicSymbols 中的那个)。然后开始调试您的测试程序,调试器将从服务器检索一个新的 PDB。使用 Debug > Windows > Modules,右键单击 System.dll 并选择“符号加载信息”。在我的机器上看起来像:

C:\projects2\ConsoleApplication407\bin\Debug\System.pdb: Cannot find or open the PDB file.
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.pdb: Cannot find or open the PDB file.
C:\Windows\System.pdb: Cannot find or open the PDB file.
C:\Windows\symbols\dll\System.pdb: Cannot find or open the PDB file.
C:\Windows\dll\System.pdb: Cannot find or open the PDB file.
C:\temp\symbols\System.pdb\c464b02c2bf04080adcad166dc729c151\System.pdb: Cannot find or open the PDB file.
C:\temp\symbols\MicrosoftPublicSymbols\System.pdb\c464b02c2bf04080adcad166dc729c151\System.pdb: Cannot find or open the PDB file.
SYMSRV:  C:\temp\symbols\System.pdb\C464B02C2BF04080ADCAD166DC729C151\System.pdb not found
SYMSRV:  http://referencesource.microsoft.com/symbols/System.pdb/C464B02C2BF04080ADCAD166DC729C151/System.pdb not found
http://referencesource.microsoft.com/symbols: Symbols not found on symbol server.
SYMSRV:  System.pdb from http://msdl.microsoft.com/download/symbols: 96985 bytes 
http://msdl.microsoft.com/download/symbols: Symbols downloaded from symbol server.
C:\temp\symbols\System.pdb\C464B02C2BF04080ADCAD166DC729C151\System.pdb: Symbols loaded.

您可以看到它在正常位置搜索 PDB 并没有找到它。然后联系 SYMSRV。它应该首先转到http://referencesource.microsoft.com,但该服务器显示“未找到”。您将从常规的 msdl 服务器获得副本,即没有必要文件 + 行号调试信息的剥离服务器。

没有彻底解决此问题,您必须再次将您的机器降级到参考源版本。使用 Windows 8.1 我无法做到的事情。而且不应该,我用的是VS2013。 Redgate 的 Reflector 是一种替代方案。

我为此创建了一个UserVoice item,它需要更多的投票。


更新:参考源现已更新至 4.5.2(2015 年 3 月)

【讨论】:

  • 谢谢大家。这也有帮助:stackoverflow.com/q/8139269/39“用于单步执行源代码的 PDB 仅针对 RTM 和服务包发布。因此,当安全更新发布并修改您尝试调试的 dll 时,将导致源单步执行不起作用(也就是说,您会看到“无可用来源”,“浏览以查找来源”为灰色)。”
  • 即使我降级到 4.5.1 btw,我也会得到相同的行为。
  • 您可能错过了答案中的“更麻烦,因为安全性和稳定性更新”部分。
  • 啊好吧,是的,错过了那部分:)
  • 参考源是否为 4.6.2? referencesource.microsoft.com 暗示它是,但我无法进入源代码。我尝试使用上述技术进行确认,但没有“SYMSRV:”条目(VS2015 Update 3)。
【解决方案2】:

JetBrains DotPeek(当前版本 1.2)有一个非常好的功能,它不仅可以让您生成 pdb,还可以通过内置的符号服务器在本地提供这些 pdb,以便在调试时向 Visual Studio 提供符号。很明显,源代码是反编译的代码,而不是实际的源代码,但在普通 MS 符号服务器无法为您提供所需的 pdb 时,它仍然非常有用。

有关符号服务器功能的信息可以在their website 上找到。

【讨论】:

  • 微软无法理顺他们的符号服务器和所需的引用,因此调试到 .NET 框架类是一个“正常工作”的功能,这太荒谬了。 Visual Studio 应该能够解决对源代码的任何框架引用,而无需任何调整……我也购买了 DotPeek 并使用它来调试 .NET 框架类。 (感谢 JetBrains 制作了这样的产品!)
  • 使用任何反编译工具意味着您没有有趣的信息,例如 cmets 和一些名称。对于某些目的,这可能就足够了,但老实说,我宁愿有参考来源。
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多