Visual Studio 调试器未进入 .NET Framework 源代码
Visual Studio Debugger not stepping into .NET framework source code
我正在进行这个简单的异步调用。我想跟随对 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
class.[= 上调用异步编程模型 (APM) 方法 BeginGetResponse
进一步安排线程池线程上的工作。 33=]
这是来自 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
的调试符号。因此,我单击加载按钮让它在运行时从 Microsoft Symbol Server 下载它们。
即便如此,虽然它确实在 DownloadBits
方法处中断,但正如我从 调用堆栈 Window 和它打印的消息中看到的那样我在设置断点时要求它打印的 输出 Window,它没有显示或进入该方法的源代码。
我在 调用堆栈 Window 中右键单击 DownloadBits
方法的堆栈帧以单击 加载符号 菜单项,但它不存在。因此,转到源代码 菜单项也被禁用。
我清除了缓存并让它重新下载所有程序集,但这也没有帮助。
我正在使用 Visual Studio Community Edition 2015,我的程序针对的是 .NET Framework v4.5.2,我之前已经多次使用此设置进入 .NET 源程序集。
我错过了什么?
您可以尝试将动态符号服务器与 dotPeek 一起使用。它将反编译程序集并充当普通的符号服务器。
在 dotPeek 中设置符号服务器(工具 -> 符号服务器)。将符号服务器地址复制到剪贴板。
将此符号服务器添加到 Visual Studio 并删除另一个(或禁用它)。
请注意,加载所有 .NET 程序集可能需要很长时间。您可以通过在 dotPeek 中选择 Assemblies opened in the Assembly Explorer
选项来调整它。
我正在进行这个简单的异步调用。我想跟随对 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
class.[= 上调用异步编程模型 (APM) 方法 BeginGetResponse
进一步安排线程池线程上的工作。 33=]
这是来自 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
的调试符号。因此,我单击加载按钮让它在运行时从 Microsoft Symbol Server 下载它们。
即便如此,虽然它确实在 DownloadBits
方法处中断,但正如我从 调用堆栈 Window 和它打印的消息中看到的那样我在设置断点时要求它打印的 输出 Window,它没有显示或进入该方法的源代码。
我在 调用堆栈 Window 中右键单击 DownloadBits
方法的堆栈帧以单击 加载符号 菜单项,但它不存在。因此,转到源代码 菜单项也被禁用。
我清除了缓存并让它重新下载所有程序集,但这也没有帮助。
我正在使用 Visual Studio Community Edition 2015,我的程序针对的是 .NET Framework v4.5.2,我之前已经多次使用此设置进入 .NET 源程序集。
我错过了什么?
您可以尝试将动态符号服务器与 dotPeek 一起使用。它将反编译程序集并充当普通的符号服务器。
在 dotPeek 中设置符号服务器(工具 -> 符号服务器)。将符号服务器地址复制到剪贴板。
将此符号服务器添加到 Visual Studio 并删除另一个(或禁用它)。
请注意,加载所有 .NET 程序集可能需要很长时间。您可以通过在 dotPeek 中选择 Assemblies opened in the Assembly Explorer
选项来调整它。