如何调试到 .NET 框架源代码

Posted

技术标签:

【中文标题】如何调试到 .NET 框架源代码【英文标题】:How to debug into .NET framework source code 【发布时间】:2019-02-19 20:35:26 【问题描述】:

如何使用 Visual Studio 2017 调试 .NET 框架源代码?

*** 上有一些关于这个主题的问题,但即使阅读了所有这些问题,我仍然无法解决问题。 我认为提供一个关于如何调试 .NET 框架源代码的最新、有效的解决方案会很有用。

我想在不使用任何外部工具(例如 dotPeek 作为源服务器)的情况下解决它。

【问题讨论】:

【参考方案1】:

首先,我使用 Microsoft Visual Studio Enterprise 2017,版本 15.9.7 并通过 .NET Framework 4.7.2 对其进行了测试。不过,我认为它应该以同样的方式在社区版上运行。

采取的步骤:

    转到工具/选项/调试/常规,然后执行以下设置:

    勾选启用 .NET Framework 源代码步进(这将自动禁用“仅启用我的代码”;如果没有,请手动执行) 取消选中要求源文件与原始版本完全匹配 勾选启用源服务器支持

    转到工具/选项/调试/符号,然后:

    在上方列表框中选中 Microsoft Symbol Servers 点击清空符号缓存按钮(以确保您将获得正确的符号) 选择加载所有模块,除非排除在外底部的单选按钮

    从https://referencesource.microsoft.com/download.html 站点下载您的项目所针对的 .NET 框架版本的源代码。

    将下载的存档 (zip) 文件解压缩到 PC 上的方便路径。

    调试您的应用程序;在要调试的 .NET 代码行设置断点,然后使用调试器单步执行所需的代码行。

注意:您的应用程序可能会启动较慢,因为它会从 Internet 下载 PDB。

    进入(默认为 F11)。如果您的设置正确,这将导致一些延迟(如果您的 VS 崩溃(就像我的那样),Empty Symbol Cache 再次)。最终它将询问给定文件的来源,例如dictionary.cs。 这里可能会发生两件事:

    A) 它在文件对话框中询问源文件 (.cs)。转到第 7 步。 B) 它显示whatever.cs 未找到,并且有一个链接显示“Browse and find whatever.cs...”。点击该链接。

    在你的磁盘上选择对应的.cs文件(你可以在操作系统上搜索该文件)。

注意:在寻找源代码时,我不得不多次重启 VS,直到它“没有崩溃”,这很可能是 VS 中的一个错误。

    如果您做的一切都正确,您会发现自己正在调试 .NET 源代码。

注意:由于VS会保存你输入的源文件路径,你可以停止调试或者重启VS;下次它也会起作用。 此外,您不必在框架内手动选择更多源文件,因为 VS 将使用您输入的源文件夹并在那里搜索源文件。

【讨论】:

一件奇怪的事情是,这仅在从 mscorlib.dll 调试代码时才对我有效,但不适用于例如System.Core.dll。有谁知道它的解决方案吗? 值得一提的是,使用 Jetbrains Rider IDE,调试 .NET 框架代码可以完美运行,无需任何设置。【参考方案2】:

许多人想知道为什么他们不能进入源代码,尽管他们确实如上所述设置了复选框。我也是。

由于您可以将 dotnet 源提取到任何位置,Visual Studio 无法了解它们,并且原因不能是源文件本身(为什么 Visual Studio 找不到文件)。

但有些 dll 是可浏览的,有些则不能(通过双击 Visual Studios 堆栈视图或上下文菜单 > 转到源代码)。这让我想到 .pdb 本身一定是原因。如果您查看一个有效的文件(例如记事本),您会在开头看到带有文件路径(源文件)的字符串列表。在文件中,这不起作用,文件立即以二进制数据开头。

由于某种原因,微软没有在每个构建过程中创建带有完整调试信息的 .pdb。但为什么不呢 - 好问题! g

简而言之:您必须搜索包含 FULL DEBUG INFORMATION 的文件(您想调试的)的 dll 版本。这也是上下文菜单禁用“转到源”的原因。 我在全局程序集缓存中临时替换此文件以进行调试。这对我有用。

这里是 PresentationFramework.dll 的一个例子 - 4.0.30319.298 => pdb 大小:1219 KB - 4.0.30319.18408 => pdb 大小:15.562 KB

也许有人可以创建一个公共数据库 (wiki),每个人都可以添加文件和版本,以获得完整的调试信息?

【讨论】:

以上是关于如何调试到 .NET 框架源代码的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Accord.Net 框架实现基本决策树

如何从 jited .Net 函数的原始地址获取源代码信息?

调试 ASP.NET Core 2.0 源代码

用xposed框架写代码可以用debug调试吗?

如何使用符号和源代码打包和部署 NuGet 包,以便调试器可以使用该源代码?

Reflector10安装与破解