我正在尝试通过单击堆栈跟踪来调试 System.Net.Http.Formating.dll:
System.Net.Http.Formatting.dll!System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStreamAsync.AnonymousMethod__c()
我有“仅禁用我的代码”并且我有以下符号服务器:
https://nuget.smbsrc.net
http://localhost:33417/ (dot peek)
Microsoft Symbol Server
我确实有可用的 pdb,但是我收到以下错误/图像。
如何正确克服?
为什么在 Visual Studio 中调试第三方源代码这么麻烦?
最佳答案
按照@Jack Zhai-MSFT 指向的链接后,我终于能够理解 .net 框架无法调试的原因。
事实证明,这些符号是在没有各自来源的情况下下载的,因为我指向 Microsoft Symbol Server 而不是 http://referencesource.microsoft.com/symbols
然后,我的以下尝试是取消选中“Microsoft Symbols Server”或更改“Symbols”菜单中的顺序。令我惊讶的是,我无法删除它,也无法更改顺序,而且即使在禁用它之后,仍然可以从那里获取符号。
也许这是一个 VS2017 社区错误。
我接下来所做的,实际上解决了这个问题:
- 删除了我的符号缓存,其中包含没有源代码的误导性 pdb
- 仅启用我的代码标志,禁用“启用 .NET Framework 源代码单步调试”并在 Debug模式下启动应用
- 在断点处暂停,在该断点处,我可以访问我想要调试的代码
- 双击该堆栈,然后点击“加载符号”。
- 这一次,由于某种原因,微软符号服务器被跳过,并下载了正确的 pdb
请注意,我仍然无法下载一些“优化符号”,例如 system.net.http,但接下来我会尝试解决这个问题
此外,我使用它作为引用来设置符号服务器,这帮助我快速获取任何第三方符号(.net 除外)
https://www.symbolsource.org/Public/Wiki/Using
编辑:
在 dotPeeker 的帮助下,我能够通过以下方式获取所有丢失的 pdb 文件:
- 将这些 dll 加载到 dotpeeker 中(例如:System.Net.Http)
- 从该 DLL 加载源文件之一
- 点击“生成 PDB”并将其存储到 VS2017 使用的同一缓存文件夹中
唷!!本来应该是微不足道的事情,真是麻烦啊!
关于debugging - Vs2017 源不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45574986/