无法进入.NET框架源代码

32

我正在使用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中进入代码?


1
清除符号缓存在上次我遇到相同问题时帮了我大忙。虽然VS显示已加载 .net 模块的符号,但是步入函数却无法工作。尝试清除缓存并让 VS 重新加载新符号:工具->选项->调试->符号->清空符号高速缓存。 - Zoltan Tirinda
2个回答

26

并且您有一个.NET 4.5.2项目。

版本号是您的问题。这是参考源代码的普遍问题,微软没有将其更新到足以为新的框架版本提供源代码的程度。更令人不安的是,对于安全性和稳定性更新而言也是如此。那些从事这项工作的人非常清楚这个问题,他们在演示中指出了这个问题,但它当前,一直都是//待办事项。

您可以可视化某些东西,首先从您的符号缓存(MicrosoftPublicSymbols 中的缓存)中删除 System.pdb。然后启动调试测试程序,调试器将从服务器检索新的 PDB。使用“调试” > “窗口” > “模块”,右键单击 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's Reflector是一种替代方案。

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


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


2
非常感谢。这也很有帮助:https://dev59.com/O-o6XIcBkEYKwwoYSCc1 “用于跟踪源代码的PDB仅发布于RTM和服务包中。因此,当安全更新出现并修改了您尝试调试的dll时,将导致源代码跟踪无法正常工作(即,您将看到灰色的“浏览以查找源代码”显示为“无可用源”)。” - huseyint
我也遇到了同样的问题,即使我降级到4.5.1版本。 - huseyint
你可能忽略了答案中“更令人担忧的安全和稳定更新”这部分。 - Hans Passant
啊,好的,是的,我漏掉了那部分 :) - huseyint
参考源代码是否已经更新到4.6.2版本?https://referencesource.microsoft.com/显示已经更新,但我无法进入源代码。我尝试使用上述技术进行确认,但没有“SYMSRV:”条目(VS2015 Update 3)。 - Jon
显示剩余3条评论

20

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

关于符号服务器功能的信息可以在他们的网站上找到。


9
微软无法解决其符号服务器和必需的引用,以便调试.NET框架类成为一个“一键即可”功能,这太荒谬了。Visual Studio应该能够在没有任何调整的情况下解决任何框架引用到源代码的问题。我也购买了DotPeek,并使用它来调试.NET框架类(感谢JetBrains开发这样的产品!)。 - Jazimov
使用任何反编译工具都意味着您不会获得有趣的信息,例如注释和某些名称。这对于某些目的可能足够了,但说实话,我宁愿拥有参考源代码。 - atlaste
这个有效^^ 更多说明请参见 https://hmemcpy.com/2014/07/how-to-debug-anything-with-visual-studio-and-jetbrains-dotpeek-v1-2/ - diox8tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接