w3wp.exe 使 IIS 8.5 经典崩溃 ASP 页

w3wp.exe Crash IIS 8.5 Classic ASP Pages

一段时间以来,我一直在努力解决以下问题,并尝试了各种 google 搜索中的许多建议。

我们在 Classic ASP 中有一个网站 运行 windows 服务器 2012 R2 使用 IIS 8.5

我们使用网站 MySQL

我们会在白天发生这种情况,但会在不同的时间发生,我怀疑这是在网站繁忙或有很多查询时发生的。 (不确定)

事件查看器(应用程序) 中,我们得到 Active Server Pages 错误

发生这种情况时,尝试向 MySQL 查询的页面将只响应 错误 500(内部错误)

错误有以下几种类型:

许多不同的页面都可能出现以下错误,这只是最后一个示例。

Error: File /update-project.asp  CreateObject Exception. The CreateObject of '(null)' caused exception C0000005..

还有这种类型的应用程序错误。这是最后一个的例子:

Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x52157ba0

Faulting module name: ntdll.dll, version: 6.3.9600.18895, time stamp: 0x5a4b127e

Exception code: 0xc0000374

Fault offset: 0x000e6214

Faulting process id: 0x2cd0

Faulting application start time: 0x01d3b5ffb8b88f62

Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe

Faulting module path: C:\Windows\SYSTEM32\ntdll.dll

Report Id: c17383f3-21f4-11e8-80f1-0cc47adae555

Faulting package full name:

Faulting package-relative application ID:

我已经尝试按照其他 post 的建议从应用程序池设置中更改很多东西,增加 MySQL 缓冲区大小等等。

一旦发生这种情况,我就执行 ApplicationPool Recycle,问题就消失了。

我下载了 DebugDiag 2 并为 w3wp.exe 进程创建了一个规则,当发生这种情况时记录了一些转储文件。

然后我打开分析器并分析它们,但我似乎看不出如何阅读或解释它们可能是什么问题。

有什么方法可以 post 或提供这些转储文件供他人尝试帮助我,因为我正急于求成。

我期待任何能帮助我或指导我正确方向甚至指导我尝试其他事情的人的任何回应。

提前致谢

下面是连接到 MySQL 和使用 FileSystemObject 以及从外部 API 获取数据的 3 个示例。这些示例中是否有任何看起来不正确的东西可能会导致这种情况,因为它不会一直发生,是随机的并且可以出现在我的任何页面上,但并不总是相同的。

sConnection = "DRIVER={MySQL ODBC 5.3 ANSI Driver}; SERVER=localhost; PORT=3306;" &_
"DATABASE=accufilemain; USER=myuser; PASSWORD=mypassword; OPTION=3;"
Set con = Server.CreateObject("ADODB.Connection")
con.Open(sConnection)

sql_check = "Select * From clients Where id = " & ClientID
Set RS = con.Execute(sql_check)
If Not RS.EOF Then

'''Get my field values
   ValABC = RS("CustomerID")

End If
State = RS.State
If State <> 0 Then
    RS.Close
    Set RS = Nothing
End If

con.Close
Set con = Nothing

sFolder1 = "C:\inetpub\wwwroot\mywebsite\files\" & ClientID

Set fs=CreateObject("Scripting.FileSystemObject") 
If Not fs.FolderExists(sFolder1) Then 
fs.CreateFolder(sFolder1) 
End If

Set fs = nothing



GetURL = ""
set objHttp = Server.CreateObject("Msxml2.ServerXMLHTTP") 
objHttp.open "GET", "otherwebsite/api/1.1.2/Customer/Get?$skip=" & MyVAL4 & "&$top=100&apikey=" & Myapikey & "&CompanyId=" & MyCompanyId, false
objHttp.setRequestHeader "Authorization", "Basic " & MyBase64AuthDetails 
objHttp.setRequestHeader "Content-Type", "application/json" 
objHttp.Send
GetURL = objHttp.ResponseText

Set objHttp = Nothing

'''' Then I can search GetURL for what I need as a string.

我有机会分析转储,这就是我的发现。

崩溃线程31的调用栈如下

0:031> kL
# ChildEBP RetAddr  
00 026ce798 778c8d78 ntdll!RtlReportCriticalFailure+0x83
01 026ce7a8 778c9629 ntdll!RtlpHeapHandleError+0x1c
02 026ce7d8 77866035 ntdll!RtlpLogHeapFailure+0xa1
03 026ce830 7174ecfa ntdll!RtlFreeHeap+0x44485
04 026ce844 717a0100 msvcr120!free+0x1a
05 026ce890 7184bab0 msvcr120!setlocale+0x186
06 026ce8bc 7184a8c3 myodbc5a!SQLFreeHandle+0x1a362
07 026ce8dc 71df704a myodbc5a!SQLFreeHandle+0x19175
.
.
.

如前所述,这是堆损坏问题的明显案例。更具体地说,它是通过调用 "double free" 操作而发生的,在该操作中您试图释放一个已经空闲的内存块。

仔细查看调用堆栈,我发现这是由 "myodbc5a" 模块引起的。这是一个 Oracle 模块。

0:031> lmvm myodbc5a
Browse full module list
start    end        module name
71830000 71d6b000   myodbc5a C (export symbols)       myodbc5a.dll
Loaded symbol image file: myodbc5a.dll
Image path: C:\Program Files (x86)\MySQL\Connector.ODBC 5.3\myodbc5a.dll
Image name: myodbc5a.dll
Browse all global symbols  functions  data
Timestamp:        Mon Jul 17 23:53:56 2017 (596D9464)
CheckSum:         00000000
ImageSize:        0053B000
File version:     5.3.9.0
Product version:  5.3.9.0
File flags:       0 (Mask 3)
File OS:          40004 NT Win32
File type:        2.0 Dll
File date:        00000000.00000000
Translations:     0409.04e4
CompanyName:      Oracle Corporation
ProductName:      Connector/ODBC 5.3
InternalName:     myodbc5a
OriginalFilename: myodbc5a.dll
ProductVersion:   5, 3, 9, 0
FileVersion:      5, 3, 9, 0
PrivateBuild:     Production
SpecialBuild:     GA release
FileDescription:  MySQL ODBC 5.3 ANSI Driver
LegalCopyright:   Copyright (c) 1995, 2013, Oracle and/or its affiliates.
LegalTrademarks:  MySQL, MyODBC, Connector/ODBC are trademarks of Oracle Corporation
Comments:         provides core driver functionality

您现在有 2 个选项可以解决此问题。

  1. 联系 Oracle 支持并说明您 运行 遇到的关于 "myodbc5a" dll 的问题,并检查他们是否已在最新版本中解决此问题

  2. 根据 - https://forums.mysql.com/read.php?37,661803,661993#msg-661993

  3. 将连接器 "myodbc5a" 降级到 5.3.4

如果您还有其他问题,请告诉我。

我已经升级到所有相关 MySQL 更新中的最新版本。然后我将连接器降级为 5.3.4 并将其放置几周以查看,问题已经消失。从那以后我再也没有遇到过问题。