Visual Studio Debugger不会进入.NET框架源代码

我正在做这个简单的异步调用。 我想要跟随对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)我仔细检查了位置,看到所有程序集都有调试符号,我的代码被引用,尤其是System.dll ,它具有设置断点的方法。

在这里输入图像描述

但是,当我在调试时运行代码时,它抱怨说找不到System.dll的调试符号。 所以,我点击Load按钮,让它在运行时从Microsoft Symbol Server下载它们。

在这里输入图像描述

尽管如此,当它在DownloadBits方法中断时,正如我从调用堆栈窗口中看到的那样,以及它在输出窗口中打印的消息,我曾要求它在设置断点时进行打印,但它没有显示或插入该方法的来源。

在这里输入图像描述

我在调用堆栈窗口中右键单击DownloadBits方法的堆栈框以单击加载符号菜单项,但它不在那里。 因此, 转到源代码菜单项也被禁用。

在这里输入图像描述

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

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

我错过了什么?


您可以尝试使用dotPeek的即时通讯服务器。 它将反编译程序集并充当正常的Symbol Server。

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

将这个Symbol Server添加到Visual Studio并删除另一个(或者只是禁用它)。

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

链接地址: http://www.djcxy.com/p/74551.html

上一篇: Visual Studio Debugger not stepping into .NET framework source code

下一篇: Debug .NET Framework Source Code in Visual Studio 2012?