Azure - 应用程序因堆栈缓冲区溢出异常 + HTTP 502 错误而崩溃

Azure - App crashed because of Stack Buffer Overrun Exception + HTTP 502 errors

我们在 Azure 应用服务上托管我们的应用程序时遇到了问题。有人可以帮助我们找到问题的根本原因吗?如果需要更多信息,也请post。

我们在尝试建立数据库连接时遇到了这个问题。我们的数据库也作为 SQL 托管实例存在于 Azure 上,我们正在使用 Active Directory Managed Identity 来创建连接。

您的应用程序因堆栈缓冲区溢出异常而崩溃,并在发生溢出时中止了它正在处理的请求。因此,您应用的用户可能会遇到 HTTP 502 错误

此调用堆栈导致异常:

InlinedCallFrame
InlinedCallFrame
DomainBoundILStubClass.IL_STUB_PInvoke
Microsoft.Data.SqlClient.SNILoadHandle..ctor
Microsoft.Data.SqlClient.SNILoadHandle..ctor
Microsoft.Data.SqlClient.SNILoadHandle..cctor
GCFrame
HelperMethodFrame
Microsoft.Data.SqlClient.TdsParser..cctor
GCFrame
HelperMethodFrame
Microsoft.Data.SqlClient.TdsParser..ctor
Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover
Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist
Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor
Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection
Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection
Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject
Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest
Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection
Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection
Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection
Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal
Microsoft.Data.SqlClient.SqlConnection.TryOpenInner
Microsoft.Data.SqlClient.SqlConnection.TryOpen
Microsoft.Data.SqlClient.SqlConnection.Open
mmd.DBConnection.establishConnection
NewAuthentication.OnPageLoad
System.Web.UI.Control.OnLoad
System.Web.UI.Control.LoadRecursive
System.Web.UI.Page.ProcessRequestMain
System.Web.UI.Page.ProcessRequest
System.Web.UI.Page.ProcessRequest
System.Web.UI.Page.ProcessRequest
ASP.classic_common_newauthentication_aspx.ProcessRequest
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute
System.Web.HttpApplication+<>c__DisplayClass285_0.b__0
System.Web.HttpApplication.ExecuteStepImpl
System.Web.HttpApplication.ExecuteStep
System.Web.HttpApplication+PipelineStepManager.ResumeSteps
System.Web.HttpApplication.BeginProcessRequestNotification
System.Web.HttpRuntime.ProcessRequestNotificationPrivate
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification
DomainNeutralILStubClass.IL_STUB_ReversePInvoke
InlinedCallFrame
InlinedCallFrame
DomainNeutralILStubClass.IL_STUB_PInvoke
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification
DomainNeutralILStubClass.IL_STUB_ReversePInvoke
ContextTransitionFrame

当进程由于应用程序代码中未处理的异常而终止时,就会发生进程崩溃。

崩溃会导致重启,所有 in-flight 请求(进程当前正在处理的请求)突然中止,并可能因 HTTP 502 错误而失败。

主动崩溃监控 是 Azure 应用服务的一项功能,可检查进程崩溃并收集诊断数据,帮助您确定根本原因 崩溃。

注意:目前在 Windows 网络应用的应用服务诊断中提供

每当与您的应用对应的工作进程 (w3wp.exe) 在同一实例 上 24 小时内因未处理的异常而崩溃超过 3 次时,功能已自动启用并且调试器进程附加到您站点的主工作进程。

此调试器进程然后等待您的进程再次崩溃,并假设它再次崩溃,收集内存转储。然后分析此内存转储,并将导致崩溃的线程的调用堆栈记录在应用服务的日志中。

查看崩溃线程信息:

按照以下步骤查看崩溃线程的 call-stack。

  1. 打开应用程序的 诊断和解决 边栏选项卡(在 left-side 导航菜单中)

  2. 选择可用性和性能类别

  3. 选择应用程序崩溃工具

  4. 如果此功能收集了崩溃的线程堆栈跟踪,您会发现如下图所示的见解

谢谢大家,

问题出在最新版本的 Microsoft.Data.SqlClient 上。根据下面的文章,我们降级了软件包,我们的问题得到了解决。

https://weblog.west-wind.com/posts/2021/Dec/07/Connection-Failures-with-MicrosoftDataSqlClient-4-and-later