再起動とビジー状態の間に ZipEngine ロールがスタックする
この記事では、zipEngine ロールが Restarting と Busy 状態の間でスタックし、次の例外がスローされる問題のトラブルシューティングについて説明します。ファイルまたはアセンブリ 'WorkerAssembly - 正しくない形式のプログラムを読み込もうとしました。
元の製品バージョン: API Management サービス
元の KB 番号: 4464909
Note
ラボの最初のシナリオである Azure Cloud Service トラブルシューティング シリーズに関する記事を参照してください。 thisに従って、Compressor アプリケーションのラボセットアップ手順に従って問題を再現していることを確認します。
現象
Compressor アプリケーションの ZipEngine ロール インスタンスは、 Restarting と Busy 状態の間で常にループ処理され、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].
トラブルシューティングの手順
ロールが開始しない場合や、ロールが初期化、ビジー状態、停止中の状態で再利用されている場合、コードが再開されるたびに、ライフサイクル イベントの内部で未処理の例外がスローされる場合があります。 したがって、上記の呼び出し履歴を注意深く調べた場合は、ワーカー ロールの OnStart() メソッドからハンドルされない例外が発生していることがわかります。 この種のシナリオのトラブルシューティングを始めるのに最適な場所は Microsoft Azure イベント ログ ロールの開始/停止、スタートアップ タスク、OnStart の開始と停止、OnRun の開始、クラッシュ、リサイクルなどの情報など、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()
次に、 Microsoft Azure イベント ログから例外の詳細を取得しました ワーカー ロールをホストするプロセスは、 System.BadImageFormatException のためにアセンブリ 'WorkerAssembly' を読み込むことができません。 一般に、プロセスがアセンブリを読み込むことができない場合は、Fusion ログをキャプチャすることをお勧めします。 fusion ログ記録を有効にするには、パス HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
の下で次のレジストリ キーを変更します。 Everyone - フル コントロール fusion ログ パス フォルダーへのアクセス許可を付与C:\FusionLogs
。
"WorkerAssembly" の Fusion ログを確認すると、トラブルシューティングの詳細が表示される場合があります。
*** 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 ビットの機能またはリソースが含まれています。 たとえば、COM 相互運用機能に依存したり、32 ビットダイナミック リンク ライブラリのメソッドを呼び出したりします。 この例外に対処するには、プロジェクトの Platform ターゲット プロパティを 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' プロジェクトの Platform target プロパティを x64 (x86 または AnyCPU ではなく) に設定し、再コンパイルします。
ZipEngine ロールのWorkerRole.csのコードを確認すると、アセンブリ 'WorkerAssembly' を実際に読み込み、何らかの関数を実行していた 2 行のコードが下に表示されます。 32 ビット アセンブリであるため、 WaWorkerHost.exe はそのアセンブリを読み込めませんでした。
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。