w3wp.exe 应用程序池每 5 分钟崩溃一次

w3wp.exe 应用程序池每 5 分钟崩溃一次

我在 Windows 2012 上有一个经典的 ASP 工作站点。一切正常。自从我将其移至 2016 机器(相同的数据库,相同的文件)后,w3wp.exe 每隔几分钟就会崩溃 ;-(

我进行了转储,每次崩溃时似乎都会出现以下 2 个错误:

在 w3wp__xxx.net(domain)(pool)__PID__8764__Date__06_06_2017__Time_05_57_31PM__204__Second_Chance_Exception_C0000374.dmp 中,Microsoft Corporation 的 C:\Windows\System32\ntdll.dll 中的 ntdll!RtlReportCriticalFailure+89 处的汇编指令在尝试对线程 48 上的内存位置 0x00000000 执行未知操作时导致了损坏的堆异常 (0xC0000374) 当前 NTGlobalFlags 值:0x0

第二个

在 w3wp__xxx.net(domain)(pool)__PID__8764__Date__06_06_2017__Time_05_57_31PM__204__Second_Chance_Exception_C0000374.dmp 中检测到了 COM+ STA 活动堆积。每个 COM+ STA ThreadPool 线程都绑定了多个活动。

如果我看一下下面的线程,我认为第一个是问题所在:

线程 48 - 系统 ID 9056

入口点 msvcrt!_threadstartex 创建时间 2017.6.6 17:53:57 用户模式花费时间 0 天 00:00:00.359 内核模式花费时间 0 天 00:00:00.343

该线程正在使用 ADO 进行数据库操作。

对 MSADO15!CCONNECTION::EXECUTE 的调用源自 vbscript!IDispatchInvoke2+76

ntdll!RtlReportCriticalFailure+89 ntdll!RtlpReportHeapFailure+32 ntdll!RtlpLogHeapFailure+9f ntdll!RtlFreeHeap+ac AcLayers!NS_FaultTolerantHeap::APIHook_RtlFreeHeap+3f70 msvcr120!free+1a msvcr120!__freetlocinfo+13e msvcr120!_updatetlocinfoEx_nolock+40 msvcr120!__updatetlocinfo+5f msvcr120!_LocaleUpdate::_LocaleUpdate+3e msvcr120!_input_l+10f msvcr120!vscan_fn+6a msvcr120!sscanf+19 myodbc5w!SQLGetCursorNameW+22887 myodbc5w!SQLGetCursorNameW+23c13 myodbc5w!SQLGetCursorNameW+169f0 myodbc5w!SQLGetCursorNameW+16399 odbc32!SetStmtAttr+5d1 odbc32!SQLSetStmtAttrW+91 msdasql!CKagRowsetProps::SetODBCOptions+1cd msdasql!CKagRowsetProps::FindCapableCC+575 msdasql!CImpICommandText::Execute+ddd msado15!CConnection::Execute+b1 msado15!_ExecuteAsync+1da msado15!ExecuteAsync+59 msado15!CQuery::Execute+fae msado15!CCommand::_Execute+18a msado15!CConnection::OpenRecordset+df msado15!CConnection::ExecuteWithModeFlag+622 msado15!CConnection::Execute+67 msado15!CConnection::Invoke+de2d vbscript!IDispatchInvoke2+76 vbscript!InvokeDispatch+4fa vbscript!CScriptRuntime::RunNoEH+f79 vbscript!CScriptRuntime::Run+dc vbscript!CScriptEntryPoint::Call+f3 vbscript!CSession::Execute+3a0 vbscript!COleScript::ExecutePendingScripts+14b vbscript!COleScript::SetScriptState+62 asp!CActiveScriptEngine::TryCall+2e asp!CActiveScriptEngine::Call+3d asp!CallScriptFunctionOfEngine+58 asp!ExecuteRequest+159 asp!Execute+237 asp!CHitObj::ViperAsyncCallback+425 asp!CViperAsyncRequest::OnCall+7e comsvc​​s!CSTAActivityWork::STAActivityWorkHelper+50 combase!EnterForCallback+142 combase!SwitchForCallback+1c6 combase!PerformCallback+b0 combase!CObjectContext::InternalContextCallback+10d combase!CObjectContext::DoCallback+31 comsvc​​s!CSTAActivityWork::DoWork+175 comsvc​​s!CSTAThread::ProcessQueueWork+68 comsvc​​s!CSTAThread::WorkerLoop+173 msvcrt!_callthreadstartex+25 msvcrt!_threadstartex+61 kernel32!BaseThreadInitThunk+24 ntdll!__RtlUserThreadStart+2f ntdll!_RtlUserThreadStart+1b

我不明白这是什么意思...我使用 mysql 5.7 和 myODBC,它与旧的 Windows 2012 上的相同。

看起来 ADo 失败了,或者怎么了?但不是每次都这样,因为我每秒都有连接,而 w3wp.exe 每隔几分钟就会失败一次,有时连续失败 3 次,有时 20 分钟都没有失败。

有人能分享一些想法吗?我必须回到旧服务器,我非常绝望。msado15.dll 会在 Windows 2016 上损坏吗?文件没问题,我用 Windows Shell 文件检查器检查过了。

是否有可能以某种方式获得 MS 的支持?免费还是付费...

谢谢

答案1

我找到了问题所在,谢谢你的帮助。这不是我的代码... Oracle 的 myODBC 自 5.3.4 以来就因堆内存问题而严重损坏 ;-( 在某人的错误报告中得到确认,但 Oracle 并未修复它...

5.3.6 及更高版本会出现此类问题,恢复到 2014 5.3.4 版本后一切又正常了...

答案2

显然,您正在处理传递给 ADO 的空指针。您需要查看代码调用 ADO 的位置​​,并确保所有参数都不是空的:

set rs=Server.CreateObject("ADODB.recordset")
If rs is Nothing then
  Response.Write("We have a problem with rs")
  Exit Sub
endif
If conn is Nothing then
  Response.Write("We have a problem with conn")
  Exit Sub
endif
rs.Open "Customers", conn

如果应用程序不会生成大量动态 HTML,那么将应用程序从 ASP 迁移到 ASP.net 并不太难。直接联系我,我可以与您讨论此事。

相关内容