发布模式下的应用程序失败

时间:2009-02-27 12:11:45

标签: c# asp.net crash release

我的ASP.NET应用程序出了问题。它已经开发了大约一年左右而没有禁用调试模式。我想测试它是否可以在没有调试的情况下工作但事实并非如此,当我设置debug =“true”时,它可以正常工作。

当我第一次尝试打开应用程序时,它会给我“服务器不可用”错误。在事件日志中,我有两个错误:

  1. .NET Runtime 2.0错误 - 错误应用程序aspnet_wp.exe,版本2.0.50727.3082,邮票492b8702,错误模块kernel32.dll,版本5.1.2600.3119,邮票46239c44,调试? 0,故障地址0x00012a5b。
  2. ASP.NET 2.0.50727.0 - 意外的进程结束aspnet_wp.exe(PID:4932)(可能写得有点不同,它已被翻译)。
  3. 我的IIS版本是在Windows XP上运行的5.1。

    我会对任何建议表示感谢。

    更新: 调试模式的更改在web.config

    中进行

7 个答案:

答案 0 :(得分:8)

您正在描述的崩溃发生在kernel32.dll中 - 这可能表明这不是托管代码中的崩溃,而是.NET引擎本身(呃) - 在这种情况下,例如验证预编译器路径等不会产生任何积极的结果(恕我直言)。

我建议你尝试通过“二进制搜索”(罪魁祸首)解决这个问题:-)。作为第一个“迭代”,我将创建一个简单的aspx页面(/Test.aspx),保持调试模式禁用并尝试点击页面(没有代码隐藏,只有标题和Hello,世界正文的基本HTML)。这将验证ASP.NET是否已在IIS服务器上安装并正常运行。

如果这个最简单的页面再次失败,我建议@JSC在评论中提到:在IIS上重新注册ASP.NET:

rem (reregister ASP.NET in IIS)
rem (run as administrator!)
%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

一旦最简单的页面运行,我会添加简单的代码隐藏,尝试一下。一旦代码隐藏运行,我会尝试通过剥离所有代码隐藏来更新应用程序的真实起始页面,只留下标记并尝试点击页面 - 是的,它看起来很可怕但至少它可能会显示:-) 。之后,我会尝试只添加初始化逻辑,看看是怎么回事......

基本上,您需要找到应用程序中导致崩溃的“事物”。我认为两个极端是:标记+没有代码隐藏=工作,标记+所有代码隐藏=崩溃;二进制搜索“方法”将启用一半代码,看它是否仍然显示(我们现在不担心功能 - 它当然不会按预期运行)。如果没有显示,请禁用上半部分的后半部分(即只有四分之一的代码处于活动状态),试试看。继续前进,直到您将搜索范围限制在有问题的区域......

我建议的另一种方法是在虚拟机上安装Server 2003(IIS6)/ Server 2008(IIS7) - VirtualPC,VMWare,VirtualBox(如果您无法访问服务器映像的MSDN下载,您可以随时下载试用版 - Server 2008试用期为60天,加上两次“重置”。在虚拟机中安装干净的操作系统后,尝试部署应用程序并查看其在该环境中的行为。

答案 1 :(得分:3)

我建议您检查代码以防止包含非调试代码的断言。我曾多次写过如下代码的常见错误:

ASSERT(doSomeCrucialOperation());

在发布模式下编译时,不会编译带有操作调用的整个Assert。

答案 2 :(得分:3)

确保您没有任何检查调试环境的条件代码。我曾经花了几天试图追踪一个随机的崩溃错误......最终遇到了类似这样的事情:

#ifdef DEBUG
  threadPoolCount = 1;
#else
  threadPoolCount = 16;
猜猜是什么......这是一个线程错误!在C#中它看起来更像是这样:

[Conditional("Debug")]

答案 3 :(得分:1)

发布调试总是很棘手,因为您依赖调试问题的一件事就是阻止它首先失败。因此,您必须即兴发挥并返回工具列表中。

稍微减少问题:在代码块之后删除/禁用块直到它停止崩溃,然后重新启用位以使其再次崩溃,缩小问题字段。将问题从“它崩溃到某个地方”分解为“它在某处围绕某处崩溃”。

记录东西。记录比平常更多。乐观地记录(“程序达到这一点,X = {0}”)。使用良好的日志记录子系统,您可以始终将它们保留并禁用输出。然后,您可以分析程序到达故障点的路径,并确定问题的位置。

答案 4 :(得分:0)

关于类似问题,有一个较旧的问题:

Program only crashes as release build -- how to debug?

这也可能有所帮助:

http://blogs.msdn.com/rahulso/archive/2006/03/02/what-is-a-crash-technically-in-asp-net-and-what-to-do-if-it-happens.aspx

您是否尝试使用(远程)调试器附加到进程,即使它不是以调试模式构建的?

答案 5 :(得分:0)

使用DebugDiag工具监控您的网站并捕获所有泄漏。请记住安装PDB。

更多信息请阅读“Application debugging in a production environment

答案 6 :(得分:0)

尝试清除临时DLL

iisreset /stop
del "%windir%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\*.*" /s/f
iisreset /start

确保正确释放非托管资源。使用USING和.Dispose。