【问题标题】:Visual Studio Debugger not stepping into .NET framework source codeVisual Studio 调试器未进入 .NET 框架源代码
【发布时间】:2017-05-30 16:12:09
【问题描述】:

我正在进行这个简单的异步调用。我想跟随对DownloadDataTaskAsync 方法的调用,并逐步进入Microsoft .NET 框架源代码。

using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace WhereIsTheTaskSchedulerHere
{
    class Program
    {
        static void Main(string[] args)
        {
            var task = GetData("http://sathyaish.net");
            var buffer = task.Result;

            var data = Encoding.ASCII.GetString(buffer);

            Console.WriteLine(data);
            Console.WriteLine("\nPress any key to continue...");
            Console.ReadKey();
        }

        async static Task<byte[]> GetData(string url)
        {
            var client = new WebClient();
            var data = await client.DownloadDataTaskAsync(url);
            return data;
        }
    }
}

我跟踪了 Reflector 中的调用,直到代码调用了 System.Net.WebClient.DownloadBits 方法。如果调用是要异步执行的,则此方法通过在 System.Net.WebRequest 类上调用异步编程模型 (APM) 方法 BeginGetResponse 来进一步调度线程池线程上的工作。

这是 Reflector 中 DownloadBits 方法的代码。

private byte[] DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp)
{
    WebResponse response = null;
    DownloadBitsState state = new DownloadBitsState(request, writeStream, completionDelegate, asyncOp, this.m_Progress, this);
    if (state.Async)
    {
        request.BeginGetResponse(new AsyncCallback(WebClient.DownloadBitsResponseCallback), state);
        return null;
    }
    response = this.m_WebResponse = this.GetWebResponse(request);
    int bytesRetrieved = state.SetResponse(response);
    while (!state.RetrieveBytes(ref bytesRetrieved))
    {
    }
    state.Close();
    return state.InnerBuffer;
}

所以,我在 Visual Studio 中设置了两个断点:

1) 关于Sytem.Net.WebClient.DownloadBits 方法的一个;和其他

2) 关于System.Net.WebRequest.BeginGetResponse 方法。

我仔细检查了以下内容。

1) 我在 Visual Studio 工具 -> 选项 对话框中正确配置了 调试 设置,允许调试器单步调试 .NET 框架源代码。

2) 我已经启用了调试符号的下载和缓存到适当的位置。

3) 我仔细检查了该位置,发现我的代码引用的所有程序集都有 Debug 符号,特别是 System.dll,它具有设置断点的方法。

但是,当我在调试的情况下运行代码时,它抱怨找不到System.dll 的调试符号。因此,我单击了加载按钮,让它在运行时从 Microsoft 符号服务器下载它们。

即便如此,虽然它确实在 DownloadBits 方法处中断,但正如我从 Call Stack Window 和它在 Output Window 中打印的消息中看到的那样我在设置断点时要求它打印,它没有显示或进入该方法的源代码。

我在调用堆栈窗口中右击DownloadBits方法的堆栈框架,点击Load Symbols菜单项,但它不存在.因此,Go to Source Code 菜单项也被禁用。

我清除了缓存并让它重新下载所有程序集,但这也没有帮助。

我正在使用 Visual Studio Community Edition 2015,我的程序针对 .NET 框架的 v4.5.2,我之前能够多次使用此设置进入 .NET 源程序集。

我错过了什么?

【问题讨论】:

  • 自 4 月 22 日左右通过 Windows Update 交付 .NET 更新以来,参考源网站一直不同步。一个非常常见的事故,根据this post..中提供的提示进行诊断。
  • @HansPassant 非常感谢。在 Modules 窗口的上下文菜单中单击 Symbol Load Information 后,Symbol Load Information 对话框报告它能够加载调试符号从我的本地缓存中获取System.dll。但是,它仍然没有踏入源头。
  • @HansPassant BTW,以 3 票赞成用户语音项目。 :-)
  • @HansPassant 我刚刚在 Modules 窗口中注意到,在我的 appdomain 中加载的程序集的 Version 列在许多情况下显示 4.6.xxx案例。 System.dll 是版本 4.6.1075.xxxx,即使我的目标是框架的 v4.5.2。但是,它的加载路径是 C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll。这有关系吗?
  • 您的目标版本无关紧要,它只是确保您可以在仅安装了 4.5.2 且从未更新过的机器上运行您的程序。您始终使用您机器上实际安装的版本执行程序。这是 4.6.1,现在它几乎适用于保持机器更新的每个人。您无法从 4.6 和 4.6.1 中添加的错误修复和设计更改中受益,它会在运行时检查您所针对的版本。

标签: c# .net visual-studio visual-studio-2015 visual-studio-debugging


【解决方案1】:

您可以尝试使用带有dotPeek 的动态符号服务器。它将反编译程序集并充当普通符号服务器。

在 dotPeek 中设置符号服务器(工具 -> 符号服务器)。将符号服务器地址复制到剪贴板。

将此符号服务器添加到 Visual Studio 并删除另一个(或禁用它)。

请注意,加载所有 .NET 程序集可能需要很长时间。您可以通过在 dotPeek 中选择 Assemblies opened in the Assembly Explorer 选项来调整它。

【讨论】:

  • 哇!谢谢,谢谢,谢谢,谢谢,非常感谢。多年来一直在努力。
猜你喜欢
  • 2017-07-30
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多