再起動とビジー状態の間に ZipEngine ロールがスタックする
この記事では、ZipEngine ロールが 再起動 状態と ビジー 状態の間でスタックし、例外がスローされる問題のトラブルシューティングに関する情報を提供します。ファイルまたはアセンブリ 'WorkerAssembly を読み込めませんでした- 正しくない形式のプログラムを読み込もうとしました。
元の製品バージョン: API Management サービス
元の KB 番号: 4464909
注:
Azure Cloud Service トラブルシューティング シリーズに関する記事を参照してください。これはラボの最初のシナリオです。 この手順に従って、コンプレッサー アプリケーションのラボのセットアップ手順に従って、問題を再現してください。
現象
コンプレッサー アプリケーションの ZipEngine ロール インスタンスは、再起動とビジー状態の間で常にループしており、Azure portal ブレードで次の未処理の例外がスローされます。
Unhandled Exception: Could not load file or assembly 'WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format. at ZipEngine.WorkerRole.OnStart() at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum) at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge. <InitializeRole> b__0() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()'[2018-08-12T11:28:39Z] Last exit time: [2018/08/12, 11:28:39.434].
手順のトラブルシューティング
ロールが起動しない場合、または初期化中、ビジー状態、停止状態の間でリサイクルされている場合は、ロールが再起動されるたびに、ライフサイクル イベントの 1 つ内で未処理の例外がスローされる可能性があります。 したがって、上記の呼び出し履歴を注意深く調べた場合、ワーカー ロールの OnStart() メソッドから未処理の例外が発生していることがわかります。 この種のシナリオのトラブルシューティングを開始するのに最適な場所は、ロールの開始/停止、スタートアップ タスク、OnStart の開始と停止、OnRun の開始、クラッシュ、リサイクルなどの情報など、Microsoft Azure ランタイムからの主要な診断出力を含む Microsoft Azure イベント ログをチェックすることです。
System.BadImageFormatException
Process ID: 5132
Process Name: WaWorkerHost
Thread ID: 4
AppDomain Unhandled Exception for role ZipEngine_IN_0
Exception: Could not load file or assembly 'WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
at ZipEngine.WorkerRole.OnStart()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)
at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.
<InitializeRole>
b__0()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
これで、System.BadImageFormatException のために、ワーカー ロールをホストするプロセスがアセンブリ 'WorkerAssembly' を読み込めないことを示す例外について、Microsoft Azure イベント ログからもう少し詳しく説明します。 一般に、プロセスでアセンブリを読み込めなかった場合は、Fusion ログをキャプチャすることをお勧めします。 パスの下に次のレジストリ キーを変更して、 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
Fusion ログを有効にします。 Fusion ログ パス フォルダーに対して、 Everyone - Full Control 権限を付与します C:\FusionLogs
。
'WorkerAssembly' のフュージョン ログを確認すると、トラブルシューティングの詳細が表示される場合があります。
*** Assembly Binder Log Entry (8/12/2018 @ 12:51:00 PM) ***
The operation failed.
Bind result: hr = 0x8007000b. An attempt was made to load a program with an incorrect format.
Assembly manager loaded from: D:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable E:\base\x64\WaWorkerHost.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///E:/approot
LOG: Initial PrivatePath = E:\approot
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = RoleManager
Calling assembly : ZipEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\approot\ZipEngine.dll.config
LOG: Using host configuration file:
LOG: Using machine configuration file from D:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///E:/approot/WorkerAssembly.DLL.
LOG: Assembly download was successful. Attempting setup of file: E:\approot\WorkerAssembly.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
ERR: Invalid assembly platform or ContentType in file (hr = 0x8007000b).
ERR: Run-from-source setup phase failed with hr = 0x8007000b.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.
上記の Fusion ログで強調表示されたエラー メッセージは、アセンブリのビット数に問題があることを示しています。 この BadImageFormatException に関する記事を参照すると、このエラーの最も可能性の高い原因は次のようになります。
"DLL または実行可能ファイルは 64 ビット アセンブリとして読み込まれますが、32 ビットの機能またはリソースが含まれています。 たとえば、32 ビットダイナミック リンク ライブラリの COM 相互運用または呼び出しメソッドに依存します。 この例外に対処するには、プロジェクトの Platform target プロパティを x86 (x64 または AnyCPU ではなく) に設定し、再コンパイルします。
アセンブリのビット数を調べるために、任意の .NET デコンパイラを実行できます。 ILSpy を使用して 'WorkerAssembly' を逆コンパイルした後、次のアセンブリが見つかる場合があります。
これは 32 ビット アセンブリ (x86) です。
// C:\WorkerAssembly.dll
// WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Global type:
<Module>
// Architecture: x86
// Runtime: .NET 4.0
Azure は 64 ビット環境です。 そのため、32 ビット ターゲット用にコンパイルされた .NET アセンブリは Azure では機能しません。 この例外に対処するには、'WorkerAssembly' プロジェクトの プラットフォーム ターゲット プロパティを x64 (x86 または AnyCPU ではなく) に設定し、再コンパイルします。
zipEngine ロールのWorkerRole.csのコードを確認すると、アセンブリ 'WorkerAssembly' を実際に読み込み、何らかの関数を実行していた 2 行のコードの下に気付くでしょう。 32 ビット アセンブリであるため、 WaWorkerHost.exe はそのアセンブリを読み込めませんでした。
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。