如何在Visual Studio 2017中调试.NET 4.6框架源代码?

22

这是我尝试过的:

在Visual Studio 2017中创建了一个新的控制台应用程序(.NET框架)。

添加了以下代码:

static void Main(string[] args)
{
    new Dictionary<int, int>().TryGetValue(3, out int x); //I want to step into TryGetValue() (this is just an example)
}

配置如下所列的设置: https://blogs.msdn.microsoft.com/sburke/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code/

确认符号已在模块窗口中加载:

mscorlib.dll 符号已加载 4.6.1586.0 built by: NETFXREL2

尝试:"单步调试 (F11)"

尝试:"单步调试至指定位置" | "System.Collections.Generic.Dictionary.TryGetValue"

两种方法都跳过了这一行。

我已经尝试使用此处的详细信息配置VS:http://www.symbolsource.org/Public/Home/VisualStudio

结果相同,调试器忽略这一行。

我查看了这里的答案:https://dev59.com/O-o6XIcBkEYKwwoYSCc1#12432029

但是这个版本似乎不是安全更新,搜索“site:support.microsoft.com/kb 4.6.1586.0"没有结果。

我做错了什么?


1
@HansPassant 删除缓存的 PDB 解决了第一个问题,谢谢(我是否有剥离的 PDB?如何判断?)现在我可以进入函数,但它是“Dictionary [from metadata]”,而不是源代码。我有相同的哈希值 BEC17127F5324AE795428E84A11901182。 - Jon
@HansPassant 我仍然有问题,因为它没有逐步执行源代码。 "Dictionary [from metadata]" 只是接口,而不是实现。 它应该从源服务器按需获取代码。 - Jon
嗯,在这个时候,你当然应该向我们展示你得到的符号跟踪。 - Hans Passant
1
是的,那是正确的。我只能假设您的“工具”>“选项”设置不正确。您没有链接到正确的文档,请导航至referencesource.microsoft.com并单击“如何配置…”链接。 - Hans Passant
1
这就是诀窍 - 参考一下,我错误地勾选了“要求源文件与原始版本完全匹配”。请注意,我尝试了所有这些设置的组合,但剥离的PDB阻止了任何东西的工作。看起来像是用户体验退化了 - 我确定我以前在模块窗口中看到过“符号已加载(剥离)”,以及当源文件与原始版本不匹配时的提示。也许这两个功能都只适用于C++。 - Jon
显示剩余2条评论
2个回答

16

以下是答案,感谢Hans Passant。请注意,此解决方案引发了其他问题。

  1. 确保 https://referencesource.microsoft.com/ 包含您正在调试的确切版本。

  2. 根据此处的说明配置Visual Studio:https://referencesource.microsoft.com/setup.html

    • 取消选中“启用我的代码”
    • 选中“启用.NET Framework源代码步进”(这应该是唯一需要的步骤)
    • 选中“启用源服务器支持”
    • 取消选中“要求源文件与原始版本完全匹配”
  3. 在模块窗口中确认符号已加载,并包含源索引。

    • 如何确定是否包含源索引?模块窗口未指定PDB是否已剥离源信息。

Microsoft可以通过提供有用的错误消息而不是默默失败来使此过程更加健壮。


感谢您在此分享解决方案,您可以将其标记为答案,以帮助其他遇到相同问题的社区成员。当然,如果您对VS产品有任何好的建议,您可以通过VS IDE菜单下的报告工具提交功能请求(http://visualstudio.uservoice.com/forums/121579-visual-studio)或反馈报告。 - Jack Zhai
2
我刚刚安装了.NET 4.7开发人员包,并在Windows 10上的VS2017中组合了一个解决方案。我尝试了所有这些说明,但无法进入List<string> Sort。我真的看不出周围有任何安全更新。可以说我有点卡住了! - Andez
1
这对我很有效 https://hmemcpy.com/2014/07/how-to-debug-anything-with-visual-studio-and-jetbrains-dotpeek-v1-2/ 基本上使用JetBrains dotPeek作为符号服务器。 - Andez

12

在JetBrains dotPeek中使用符号服务器功能。针对我来说,这个方法很有效,因为我曾经尝试过标准功能但遇到了一些问题:

  1. 运行dotPeek并进入"工具" > "选项..." > "符号服务器"。
  2. 确保选择了"所有程序集",并将本地符号服务器URL复制到剪贴板。通过在"工具"菜单中点击它来开始dotPeek符号服务器。
  3. 在Visual Studio中,进入"工具" > "选项..." > "调试" > "符号",并将dotPeek服务器URL添加到列表中。将dotPeek符号服务器尽可能地移动到列表的最高处,并取消选中列表中的其他所有符号服务器(特别地,"Microsoft Symbol Servers"和"NuGet.org Symbol Server"必须不被选择)。
  4. 开始调试-当您尝试进入Framework源代码时,您将看到dotPeek正在进行一些反编译操作,并且然后您将进入其源码。

如果这不起作用,则可能是因为Visual Studio先前从Microsoft/NuGet下载了有关该程序集的"错误"符号,并正在使用它们而不是请求dotPeek。要检查这一点,请开始调试并在模块列表中找到相关程序集(调试 > 窗口 > 模块)-删除显示在该程序集"符号文件"下路径的PDB文件,然后重新启动调试,dotPeek应该开始工作。


请问您能否解释一下如何将它连接到 VS2017? - Ini
@Invader 对于延迟和这个回答我感到抱歉。我在VS2015中完成了它。我简短地尝试过VS2017,但没有使其工作。依据他们的文档,从记忆中,让它工作了。 - Phil Haselden
1
这应该是被接受的答案,dotPeek可以完美运行,而不需要像其他答案中所详细描述的那样费力地折腾。 - Ian Kemp
谢谢!这个在2022年仍然有效。(4.6.2框架) - diox8tony

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