1 か月の長い休憩の後、昨日もプログラムの作業を続けました。コードは何も変更していませんが、アプリケーションが起動しなくなりました。ある時点で実行が中断され、デッドロックに陥っているように見えますが、メソッドが戻ったときに発生するため、実際にデッドロックであるかどうかはわかりません-通常は発生しないはずです.
コードが大きいのでお見せできません。しかし、それ自体のスレッドを超えた唯一のアクションは、Dispatcher によって呼び出されるいくつかの UI 要素へのアクセスであると断言できます。そして、昨日まですべてがうまくいきました。何も変更していません。
これはそれが起こる場所です:
internal override Task InitializeAddIns()
{
try
{
Action action = () => this._addinProvider.InitializeAddins();
Task t = Task.Factory.StartNew(action);
return t;
}
catch (Exception ex)
{
Debugger.Break();
return null;
}
}
呼び出しコード:
// Initialize AddIns
splash.SplashText = "SplashScreen:step_searchAddIns".Translate();
this._addinSystem.InitializeAddIns();
splash.SplashText = "SplashScreen:step_startAddIns".Translate();
await Task.Run(() => this._addinSystem.RunAddins());
// Resolve libraries with NativeCompressor
splash.SplashText = "SplashScreen:step_resolveDependencies".Translate();
タスクが開始され、't' が返されます。InitializeAddins() メソッドは正常に実行されて終了します (デバッガーでチェック - ログも完全に終了したことを示しています)。次のステップは、「アクション」の宣言行がマークされていることです (終了したように)。その後、デバッグが終了し、それ以上何も起こりません。この Dispatcher フックでさえ呼び出されません。
Dispatcher.CurrentDispatcher.Hooks.DispatcherInactive += (sender, args) => this.Update();
私の唯一の仮定は、どこかにデッドロックがあるということです。それ以外の場合、実行全体が停止してスタックする理由を説明できません。どこから検索を開始すればいいのか、手がかりが見つかりません。新しく導入されたコードを作り直し、デッドロックも検出するいくつかの拡張ロック メソッドを追加しました。今のところデッドロックは検出されていません。
原因がわからないので、WinDbg と SOSEX を使ってエラーの原因を探ってみました。残念ながら、WinDbg を実行できません。Symbol サーバーをチェックし、最後の出力は次のとおりです。
CLRDLL: mscorwks 検索で mscordacwks_AMD64_x86_4.0.30319.34209.dll が見つかりません CLRDLL: パス上に 'SOS_AMD64_x86_4.0.30319.34209.dll' が見つかりません: 読み込まれた DLL mscordacwks_AMD64_x86_4.0.30319.34209.dll
明らかに何かがロードされていますが、SOSEX の !dlk コマンドを呼び出すと、次のメッセージが表示されます。
0:028> !dlk .NET データ インターフェイスを初期化できません。mscordacwks.dll のバージョン 4.0.30319.34209 が必要です。正しいバージョンの mscordacwks.dll を見つけてロードします。.cordll コマンドのドキュメントを参照してください。CriticalSections を調べています... デッドロックは検出されませんでした。
したがって、このバグを修正する方法がこれ以上わかりません。この行動の理由は何ですか?例外すらありません。既に CLR 例外を有効にしていますが、それらでさえスローされません。非常に奇妙です。通常、このロックダウンは、メソッドが終了した後ではなく、途中で発生すると予想されます...