如何使应用程序池崩溃?

Posted

技术标签:

【中文标题】如何使应用程序池崩溃?【英文标题】:How do I crash the App Pool? 【发布时间】:2011-03-03 22:50:43 【问题描述】:

我们的 ASP.NET 2 Web 应用程序非常优雅地处理异常。我们在 Application_Error 中捕获 Global ASAX 中的异常。从那里我们记录异常并向用户显示一条友好的消息。

但是,今天早上我们部署了最新版本的网站。它运行了半个小时,但随后 App Pool 崩溃了。在我们恢复之前的版本之前,该网站没有恢复。

如何使应用程序池崩溃并跳过正常的异常处理程序?我正在尝试复制这个问题,但到目前为止没有运气。


更新:我们找到了解决方案。我们的一个页面正在截屏另一个页面。但是 URL 配置不正确,页面最终被无限地截屏自身,从而导致堆栈溢出异常。

【问题讨论】:

服务器上的事件日志应该告诉你发生了什么,并且会让你更好地了解如何复制它。 我认为 *** 应该这样做。 (尝试一些没有终止条件的递归) 这帮助我在我们的系统上调试了同样的问题:***.com/questions/5053708/… 【参考方案1】:

您可以尝试抛出ThreadAbortException

【讨论】:

【参考方案2】:

为了做到这一点,您需要做的就是从请求上下文之外抛出任何异常(当然不处理它)。

例如,在另一个线程上引发的一些异常应该这样做:

protected void Page_Load(object sender, EventArgs e)

   // Create a thread to throw an exception
   var thread = new Thread(() =>  throw new ArgumentException(); );

   // Start the thread to throw the exception
   thread.Start();

   // Wait a short while to give the thread time to start and throw
   Thread.Sleep(50);

更多信息可以找到here in the MS Knowledge Base

【讨论】:

【参考方案3】:

我看到的最常见的错误和“池崩溃”是循环调用。

public string sMyText

   get return sMyText;
   set sMyText = value;
 

只需调用 sMyText...

【讨论】:

【参考方案4】:

Aristos 的回答很好。当有人在不更改基本调用的情况下将覆盖方法从 OnInit 更改为 OnLoad 时,我也看到它在页面生命周期中使用愚蠢的覆盖完成,因此它在整个生命周期中循环循环:即

protected override void OnLoad(EventArgs e)

  //some other most likely rubbish code
  base.OnInit(e);

【讨论】:

啊,是的,这也是我看到的……+1

以上是关于如何使应用程序池崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

自动释放池导致 RubyCocoa 应用程序崩溃

如何在 C# .NET 中检测应用程序池重新启动?

IIS 6.0 应用程序池崩溃

如何使下面的jdbc连接配置连接池

如何使音池静音?

s-s-rS 2005 API 导致应用程序池崩溃