w3wp.exe - 应用程序错误 应用程序发生异常
应用程序发生异常 未知的软件异常 (0xc06d007e),位置为 0x7c815e02
环境是:2003 + sp1 + ie6 + Framework 2.0 + vs 2005
因为页面中数据较多,有上千条,导致出现“超过响应缓冲区限制。此 ASP 页的执行造成响应缓冲区超过其配置限制。”。
如果response.buffer=false这样设的话,可以查出,但是好慢。怎么解决?
我们可以加大Buffer的缓冲区,办法是:
先在服务里关闭iisadminservice服务
找到windows\system32\inesrv\下的metabase.xml,
打开,找到 AspBufferingLimit 把他修改为需要的值,默认为4194304,即4096KB
建议把它修改为41943040(40M)或适合的数值,取决于服务器内存是否足够大。
然后重启iisadminservice服务。
注意事项:
1、要注意服务器内存量是否足够。
2、还有因为数据量比较大,相应的还要修改ASP处理时间,即:
修改 "AspScriptTimeout " 默认值90 (秒)
修改 "AspSessionTimeout " 默认值20 (分钟)
在vs 里面调试没有问题,发布网站以后在iis上运行报错,找不到原因,网上搜索说可能是程序池里的不同版本的framework冲突,后来把全部的net全改成2.0版,一样报错。
解决办法:
点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项,
选择其下的“IIS ADMIN SERVICE”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“IWAM_*****”,
给该帐号赋予“本地启动”和“本地激活”的权限,重新启动IIS,(点“开始”-“运行”-“CMD”,点确定,然后运行IISRESET),
上面这个方法解决有点问题,没找到问题根源:请看下面:
按上述方法仍然无法解决问题,后来google搜索如下办法,不知道可行否,待查:
我已经找到问题的 答案了,是删除注册表里的两个键值就行了。
在msdn中是这样解释的:
关键词“实时调试”
实时调试是这样一种功能,当在 Visual Studio 外运行的程序遇到致命错误时,它自动启动 Visual Studio 调试器。实时调试使您能够在应用程序被操作系统终止之前检查错误。Visual Studio 调试器不需要在发生错误时是运行的。
如果在启用了实时调试的情况下发生了错误,将打开一个对话框,询问您是否要调试程序,以及要使用哪个调试器。
如果作为另一个用户运行的程序命中致命错误,则在调试器启动之前,将显示一个安全警告对话框。有关更多信息,请参见安全警告:附加到不受信任的进程可能会有危险。
您可以从“选项”对话框启用实时调试。有关更多信息,请参见如何:启用/禁用实时调试。
对于 Windows 窗体,您还必须在 machine.config 或 application.exe.config 文件中启用实时调试。有关更多信息,请参见如何:为 Windows 窗体启用实时调试。
在服务器上安装 Visual Studio 后,当发生一个未处理的异常时,默认行为会显示一个需要用户干预的“异常”对话框,用户要么启动实时调试,要么忽略该异常。这对无人参与执行可能是不需要的。若要配置服务器以在未处理的异常发生时不再显示对话框(安装 Visual Studio 之前的默认行为),请使用注册表编辑器删除以下注册表项:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/DbgManagedDebugger
在 64 位 操作系统上也删除以下注册表项:
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/.NETFramework/DbgManagedDebugger
注意
实时调试将对在本机应用程序中承载的托管代码不起作用,例如可视化工具。
注意
在 Windows Server 2003 或 Windows 2000 SP3(或更新版本)上安装 .NET Framework 后,只有在计算机重新启动后,实时调试才可用于在终端服务会话中通过受限用户帐户运行的进程。
环境是:2003 + sp1 + ie6 + Framework 2.0 + vs 2005
因为页面中数据较多,有上千条,导致出现“超过响应缓冲区限制。此 ASP 页的执行造成响应缓冲区超过其配置限制。”。
如果response.buffer=false这样设的话,可以查出,但是好慢。怎么解决?
我们可以加大Buffer的缓冲区,办法是:
先在服务里关闭iisadminservice服务
找到windows\system32\inesrv\下的metabase.xml,
打开,找到 AspBufferingLimit 把他修改为需要的值,默认为4194304,即4096KB
建议把它修改为41943040(40M)或适合的数值,取决于服务器内存是否足够大。
然后重启iisadminservice服务。
注意事项:
1、要注意服务器内存量是否足够。
2、还有因为数据量比较大,相应的还要修改ASP处理时间,即:
修改 "AspScriptTimeout " 默认值90 (秒)
修改 "AspSessionTimeout " 默认值20 (分钟)
在vs 里面调试没有问题,发布网站以后在iis上运行报错,找不到原因,网上搜索说可能是程序池里的不同版本的framework冲突,后来把全部的net全改成2.0版,一样报错。
解决办法:
点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项,
选择其下的“IIS ADMIN SERVICE”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“IWAM_*****”,
给该帐号赋予“本地启动”和“本地激活”的权限,重新启动IIS,(点“开始”-“运行”-“CMD”,点确定,然后运行IISRESET),
上面这个方法解决有点问题,没找到问题根源:请看下面:
按上述方法仍然无法解决问题,后来google搜索如下办法,不知道可行否,待查:
我已经找到问题的 答案了,是删除注册表里的两个键值就行了。
在msdn中是这样解释的:
关键词“实时调试”
实时调试是这样一种功能,当在 Visual Studio 外运行的程序遇到致命错误时,它自动启动 Visual Studio 调试器。实时调试使您能够在应用程序被操作系统终止之前检查错误。Visual Studio 调试器不需要在发生错误时是运行的。
如果在启用了实时调试的情况下发生了错误,将打开一个对话框,询问您是否要调试程序,以及要使用哪个调试器。
如果作为另一个用户运行的程序命中致命错误,则在调试器启动之前,将显示一个安全警告对话框。有关更多信息,请参见安全警告:附加到不受信任的进程可能会有危险。
您可以从“选项”对话框启用实时调试。有关更多信息,请参见如何:启用/禁用实时调试。
对于 Windows 窗体,您还必须在 machine.config 或 application.exe.config 文件中启用实时调试。有关更多信息,请参见如何:为 Windows 窗体启用实时调试。
在服务器上安装 Visual Studio 后,当发生一个未处理的异常时,默认行为会显示一个需要用户干预的“异常”对话框,用户要么启动实时调试,要么忽略该异常。这对无人参与执行可能是不需要的。若要配置服务器以在未处理的异常发生时不再显示对话框(安装 Visual Studio 之前的默认行为),请使用注册表编辑器删除以下注册表项:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/DbgManagedDebugger
在 64 位 操作系统上也删除以下注册表项:
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/.NETFramework/DbgManagedDebugger
注意
实时调试将对在本机应用程序中承载的托管代码不起作用,例如可视化工具。
注意
在 Windows Server 2003 或 Windows 2000 SP3(或更新版本)上安装 .NET Framework 后,只有在计算机重新启动后,实时调试才可用于在终端服务会话中通过受限用户帐户运行的进程。
解决w3wp.exe内存占用问题 w3wp.exe CPU占用100%在IIS6下,经常出现w3wp.exe的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢。
解决内存占用过多,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。再设置当内存占用超过多少(如500M),就自动回收内存。
解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭。
根据w3wp取得是那个一个应用程序池:
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在C:/windows/system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script Host”来执行,就可以得到PID与应用程序池的对应关系。)
3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。
解决内存占用过多,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。再设置当内存占用超过多少(如500M),就自动回收内存。
解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭。
根据w3wp取得是那个一个应用程序池:
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在C:/windows/system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script Host”来执行,就可以得到PID与应用程序池的对应关系。)
3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。