Wat*_* v2 7 .net c# visual-studio visual-studio-debugging visual-studio-2015
我正在进行这个简单的异步调用.我想跟随调用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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在Reflector中跟踪调用,直到代码调用System.Net.WebClient.DownloadBits方法为止.如果调用是异步执行的,则此方法通过调用类上的异步编程模型(APM)方法进一步调度线程池线程BeginGetResponse上的工作System.Net.WebRequest.
这是DownloadBitsReflector 的方法代码.
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;
}
Run Code Online (Sandbox Code Playgroud)
所以,我在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 程序集可能需要很长时间。您可以通过Assemblies opened in the Assembly Explorer在 dotPeek 中选择选项来调整它。
额外说明:https://hmemcpy.com/2014/07/how-to-debug-anything-with-visual-studio-and-jetbrains-dotpeek-v1-2/
| 归档时间: |
|
| 查看次数: |
1625 次 |
| 最近记录: |