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。
打开应用程序的 诊断和解决 边栏选项卡(在 left-side 导航菜单中)
选择可用性和性能类别
选择应用程序崩溃工具
如果此功能收集了崩溃的线程堆栈跟踪,您会发现如下图所示的见解
谢谢大家,
问题出在最新版本的 Microsoft.Data.SqlClient 上。根据下面的文章,我们降级了软件包,我们的问题得到了解决。
我们在 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。
打开应用程序的 诊断和解决 边栏选项卡(在 left-side 导航菜单中)
选择可用性和性能类别
选择应用程序崩溃工具
如果此功能收集了崩溃的线程堆栈跟踪,您会发现如下图所示的见解
谢谢大家,
问题出在最新版本的 Microsoft.Data.SqlClient 上。根据下面的文章,我们降级了软件包,我们的问题得到了解决。