1

我的 ASP.NET 应用程序有问题。在没有禁用调试模式的情况下,它已经开发了大约一年左右。我想测试它是否在没有调试的情况下工作,但不是,但是当我设置 debug="true" 时,它工作正常。

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

  1. .NET 运行时 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) 意外结束(可能写的有点不同,已翻译)。

我的 IIS 版本是 5.1,在 Windows XP 上运行。

我会很感激任何建议。

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

4

7 回答 7

8

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

我建议您尝试通过“二进制搜索”(对于罪魁祸首)解决此问题:-)。作为第一次“迭代”,我将创建一个简单的 aspx 页面 (/Test.aspx),禁用调试模式并尝试点击该页面(没有代码隐藏,只是带有标题和 Hello,world 正文的基本 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 天,外加两次“重置”)。在虚拟机中安装干净的操作系统后,尝试部署您的应用程序并查看它在该环境中的行为。

于 2009-03-03T13:22:39.287 回答
3

我建议您根据包含非调试代码的断言检查您的代码。我在编写代码时犯了几次常见错误,如下所示:

断言(doSomeCrucialOperation());

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

于 2009-02-27T17:11:00.317 回答
3

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

#ifdef DEBUG
  threadPoolCount = 1;
#else
  threadPoolCount = 16;

你猜怎么着......这是一个线程错误!在 C# 中,它看起来更像这样:

[Conditional("Debug")]
于 2009-02-27T17:53:34.160 回答
1

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

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

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

于 2009-03-06T10:27:34.003 回答
0

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

程序仅在发布版本时崩溃——如何调试?

这也可能有帮助:

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

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

于 2009-02-27T18:31:51.013 回答
0

使用DebugDiag工具监视您的站点并捕获所有泄漏。记得安装 PDB。

更多信息请阅读“生产环境中的应用程序调试

于 2009-03-06T13:13:20.657 回答
0

尝试清除临时 DLL

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

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

于 2009-03-07T05:57:27.030 回答