c# – 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)我仔细检查了位置,发现我的代码引用的所有程序集都有Debug符号,特别是对于具有我的断点设置方法的System.dll. 但是,当我运行调试代码时,它抱怨它无法找到System.dll的调试符号.因此,我单击“加载”按钮,让它在运行时从Microsoft Symbol Server下载它们. 即便如此,虽然它确实在DownloadBits方法中出现了问题,正如我在调用堆栈窗口中看到的那样,以及在设置断点时我要求它打印的输出窗口中打印的消息,它没有显示或进入该方法的来源. 我在“调用堆栈”窗口中右键单击了DownloadBits方法的堆栈框,单击“加载符号”菜单项,但它不在那里.因此,还禁用了“转到源代码”菜单项. 我清除了缓存,让它重新下载所有程序集,但这也没有帮助. 我正在使用Visual Studio Community Edition 2015,我的程序是针对.NET框架的v4.5.2,我之前已经能够使用此设置多次进入.NET源程序集. 我错过了什么? 解决方法
您可以尝试使用带有
dotPeek的动态符号服务器.它将反编译程序集并充当普通的符号服务器.
在dotPeek中设置符号服务器(工具 – >符号服务器).将符号服务器地址复制到剪贴板. 将此符号服务器添加到Visual Studio并删除另一个(或者只是禁用它). 请注意,加载所有.NET程序集可能需要很长时间.您可以通过选择dotPeek中的Assembly Explorer选项中打开的Assemblies来调整它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |