WCSF フレームワークと .NET 2.0 を使用して Web サイトを作成しました。
現在、このアプリケーションは稼働しており、1000 人以上のユーザーが使用しています。これを Windows 2008 Server R2 の IIS 7 のクラウドに展開しました。バックエンドには Sql Server 2008 R2 データベースも使用しています。展開アーキテクチャは次のとおりです。
スティッキー セッションを使用してロード バランサ (ハードウェア ベース) の下に接続された 2 つの Web サーバーがあります。これら 2 つのサーバーは、2 つのデータベース サーバーと通信し、その間に 600 を超えるデータベースが均等に分散されています。すべてのリクエストは、最初に適切な db サーバーにリダイレクトする管理データベースに送られます。
では本題へ……。
両方のサーバーで 1 日あたり約 4 ~ 5 回の w3wp クラッシュが発生しています。この間、アプリケーションに接続しているすべてのユーザーがログアウトされます。
障害のあるアプリケーション名: w3wp.exe、バージョン: 7.5.7601.17514、タイム スタンプ: 0x4ce7afa2 障害のあるモジュール名: KERNELBASE.dll、バージョン: 6.1.7601.18229、タイム スタンプ: 0x51fb1677 例外コード: 0xe053534f 障害オフセット: 0x000000000000940d 障害のあるプロセス9 障害のあるアプリケーションの開始時刻: 0x%10 障害のあるアプリケーション パス: %11 障害のあるモジュール パス: %12 レポート ID: %13
最近、MS に訴訟を起こし、彼らのコメントを以下に示します。
---マイクロソフトの対応開始---
スタック オーバーフローの問題により、プロセスがクラッシュしました。
.Net コール スタック:
System.Enum.System.IConvertible.ToInt64(System.IFormatProvider)
System.Convert.ToInt64(System.Object, System.IFormatProvider)
System.Enum.ToUInt64(System.Object)
System.Enum.IsDefined(System.Type, System.Object)
Microsoft.Practices.ObjectBuilder.Locator.Get(System.Object, Microsoft.Practices.ObjectBuilder.SearchMode)
Microsoft.Practices.ObjectBuilder.ReadableLocator.Get[[System.__Canon, mscorlib]](System.Object)
<Trimmed>
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
完全なコール スタック
URL に対して呼び出しが行われていることがわかります:- ASP.xxxdashboards_recordlistview_aspx
ntdll!ZwTerminateProcess
KERNELBASE!TerminateProcess+2f
mscorwks!EEPolicy::HandleFatalStackOverflow+13b
mscorwks!EEPolicy::HandleStackOverflow+212
mscorwks!CLRVectoredExceptionHandler+3de1be
mscorwks!CLRVectoredExceptionHandlerShim+42
ntdll!RtlpCallVectoredHandlers+a8
ntdll!RtlDispatchException+22
ntdll!KiUserExceptionDispatch+2e
KERNELBASE!RaiseException+39
mscorwks!AllocateObject+34aeb1
mscorwks!MethodTable::FastBox+43
mscorwks!MethodTable::Box+5b
mscorwks!ReflectionEnum::InternalGetEnumValue+139
System.Enum.System.IConvertible.ToInt64(System.IFormatProvider)+b
System.Convert.ToInt64(System.Object, System.IFormatProvider)+35
System.Enum.ToUInt64(System.Object)+9d
System.Enum.IsDefined(System.Type, System.Object)+ff
Microsoft.Practices.ObjectBuilder.Locator.Get(System.Object, Microsoft.Practices.ObjectBuilder.SearchMode)+4d
Microsoft.Practices.ObjectBuilder.ReadableLocator.Get[[System.__Canon, mscorlib]](System.Object)+10
Microsoft.Practices.CompositeWeb.BuilderStrategies.SessionStateBindingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+11f
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.SessionStateBindingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+2be
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.SessionStateBindingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+2be
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.SessionStateBindingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+2be
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.SessionStateBindingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+2be
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.SessionStateBindingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+2be
<Trimmed>
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+28e
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+28e
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+56
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)+28e
Microsoft.Practices.CompositeWeb.ObjectBuilder.WCSFBuilderBase`1[[Microsoft.Practices.CompositeWeb.ObjectBuilder.WCSFBuilderStage, Microsoft.Practices.CompositeWeb]].DoBuildUp(Microsoft.Practices.ObjectBuilder.IReadWriteLocator, System.Type, System.String, System.Object, Microsoft.Practices.ObjectBuilder.PolicyList[])+13a
Microsoft.Practices.CompositeWeb.ObjectBuilder.WCSFBuilderBase`1[[Microsoft.Practices.CompositeWeb.ObjectBuilder.WCSFBuilderStage, Microsoft.Practices.CompositeWeb]].BuildUp(Microsoft.Practices.ObjectBuilder.IReadWriteLocator, System.Type, System.String, System.Object, Microsoft.Practices.ObjectBuilder.PolicyList[])+64
Microsoft.Practices.CompositeWeb.CompositionContainer.BuildItem(Microsoft.Practices.ObjectBuilder.IBuilder`1<Microsoft.Practices.CompositeWeb.ObjectBuilder.WCSFBuilderStage>, Microsoft.Practices.ObjectBuilder.IReadWriteLocator, System.Object)+334
Microsoft.Practices.CompositeWeb.WebClientApplication.BuildItemWithCurrentContext(System.Object)+121
Microsoft.Practices.CompositeWeb.Web.UI.UserControl.OnInit(System.EventArgs)+3f
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+8f
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Control.AddedControl(System.Web.UI.Control, Int32)+10f
DevExpress.Web.ASPxTabControl.Internal.PCContentsControl.CreateControlHierarchy()+2ae
DevExpress.Web.ASPxClasses.ASPxWebControlBase.CreateChildControls()+33
<Trimmed>
System.Web.UI.Control.EnsureChildControls()+92
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControls()+9
DevExpress.Web.ASPxClasses.ASPxWebControlBase.DevExpress.Web.ASPxClasses.Internal.IASPxWebControl.EnsureChildControls()+d
DevExpress.Web.ASPxClasses.Internal.RenderUtils.EnsureChildControlsRecursive(System.Web.UI.Control, Boolean)+3e
DevExpress.Web.ASPxClasses.Internal.RenderUtils.EnsureChildControlsRecursive(System.Web.UI.Control, Boolean)+d0
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(System.Web.UI.Control)+25
DevExpress.Web.ASPxClasses.ASPxWebControl.CreateChildControls()+166
System.Web.UI.Control.EnsureChildControls()+92
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControls()+9
DevExpress.Web.ASPxClasses.ASPxWebControlBase.DevExpress.Web.ASPxClasses.Internal.IASPxWebControl.EnsureChildControls()+d
DevExpress.Web.ASPxClasses.Internal.RenderUtils.EnsureChildControlsRecursive(System.Web.UI.Control, Boolean)+3e
DevExpress.Web.ASPxClasses.Internal.RenderUtils.EnsureChildControlsRecursive(System.Web.UI.Control, Boolean)+d0
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(System.Web.UI.Control)+25
DevExpress.Web.ASPxClasses.ASPxWebControl.CreateChildControls()+166
System.Web.UI.Control.EnsureChildControls()+92
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControls()+9
DevExpress.Web.ASPxClasses.ASPxWebControl.InitInternal()+48
DevExpress.Web.ASPxClasses.ASPxDataWebControlBase.OnInit(System.EventArgs)+1c
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+8f
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Control.InitRecursive(System.Web.UI.Control)+187
System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)+5c5
System.Web.UI.Page.ProcessRequest(Boolean, Boolean)+a0
System.Web.UI.Page.ProcessRequest()+5b
System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)+f0
ASP.xxxdashboards_recordlistview_aspx.ProcessRequest(System.Web.HttpContext)+9
次のコードは、最終的に StackOverflow の状況につながるタイトな再帰ループで見られます。
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
Microsoft.Practices.CompositeWeb.BuilderStrategies.ContainerAwareTypeMappingStrategy.BuildUp(Microsoft.Practices.ObjectBuilder.IBuilderContext, System.Type, System.Object, System.String)
さらに、彼らは次のことも付け加えました。
無限ループを確認するためにコードを調べたところ、
Microsoft_Practices_CompositeWeb!Microsoft.Practices.CompositeWeb.BuilderStrategies.SessionStateBindingStrategy 内にあるようです。
public override object BuildUp(IBuilderContext context, Type typeToBuild, object existing, string idToBuild)
{
ISessionStateLocatorService service = context.Locator.(object);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://Microsoft.Practices.ObjectBuilder:1.0.51206.0:b03f5f7f11d50a3a/Microsoft.Practices.ObjectBuilder.IReadableLocator/Get<>(Object):"Get<ISessionStateLocatorService>(new DependencyResolutionLocatorKey(typeof(ISessionStateLocatorService), null));
if (service != null)
{
IHttpSessionState sessionState = service.GetSessionState();
foreach (FieldInfo info in typeToBuild.GetFields())
{
this.SetFieldValue(existing, info, sessionState);
}
}
return base.BuildUp(context, typeToBuild, existing, idToBuild);
}
したがって、これは Microsoft_Practices_ObjectBuilder!Microsoft.Practices.ObjectBuilder.BuilderStrategy で定義された BuildUp を呼び出します
public virtual object BuildUp(IBuilderContext context, Type typeToBuild, object existing, string idToBuild)
{
IBuilderStrategy nextInChain = context.GetNextInChain(this);
if (nextInChain != null)
{
return nextInChain.BuildUp(context, typeToBuild, existing, idToBuild);
}
return existing;
}
これにより、無限ループが発生します。
---マイクロソフトの回答を終了します---
現時点ではどこで問題を探すべきかわかりません。誰かが問題を解決するのを手伝ってくれるなら、それは非常にありがたいです.