如何跟踪应用程序锁定的位置

时间:2015-11-24 21:36:05

标签: asp.net azure azure-web-sites

我有一个托管的Windows Azure网站。我发现网站在用户网络浏览器中锁定的情况(几个月前我问过这个问题 - Launching SSRS Report causes browser to hang)。

我已经设置了流日志记录,现在可以在VS2015中查看流。我是global.asax,我在每个处理程序的开头和结尾添加了一个trace语句。关于我的失败(挂起)请求 - 请参阅链接帖子以获取更多详细信息 - 我看到" PostMapRequestHandler"事件彻底发生。似乎触发的下一个事件(基于监视成功的请求)是AcquireRequestState。

在我失败的请求状态中,我从未看到AcquireRequestState完成。如果我提出了一个有目的的错误 - 抛出新的例外("扔我") - 该应用程序将显示黄色。但是如果我在这里只有我的跟踪语句,我从来没有看到这个方法完成。

当我处于这种糟糕的状态时,浏览器永远不会从服务器返回响应。在等待大约5-10分钟后,该页面将为500。如果我完全关闭浏览器并打开一个新窗口,基本上会抛弃旧的会话信息,我只能解决这个问题。

  1. 在这个全局方法处理程序中,我可以在哪里挖掘出为什么会失败?
  2. 它告诉我AcquireRequestState没有完成的内容是什么?我的直觉告诉我,我正在处理一些"坏"会议mojo在这里,但有点难过..

2 个答案:

答案 0 :(得分:0)

有几种可能性:

  1. 根据您运行网站的方式,您可以将带有其他代码的.PDB文件放到服务器上,并在问题发生时捕获流程的快照(您可以)需要桌面访问服务器,这取决于您用来托管网站的天蓝色系统。在任务管理器中,右键单击相应的w3wp进程,然后选择"创建转储文件"。
  2. 它已被弃用,但在过去,我使用Thread.Suspend()new StackTrace(thread, true)Thread.Resume()获得了公平(不是很好)的结果。请注意,其中一些功能已被弃用,这需要非常小心。您需要非常小心地在每个请求进入时创建一个Threads列表,并添加一种新类型的请求,该请求遍历列表获取线程状态并将其转储出去。 (.NET中缺少此功能是诊断诸如你的问题的严重问题(在大型系统中并不罕见)。
  3. 在导致问题的执行路径中添加额外的临时日志代码,重新创建问题,并迭代检查日志结果,并添加更多日志记录,直到您追踪问题。
  4. 这对我来说听起来像是一个无限循环。

答案 1 :(得分:0)

您是否尝试将调试程序附加到您的网络应用程序?你可以这样做: https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-troubleshoot-visual-studio/

连接调试器将允许您查看所有线程和调用堆栈,因此它应该有助于诊断问题。