Dela via


ZipEngine-rollen har fastnat mellan omstart och upptaget tillstånd

Den här artikeln innehåller information om felsökningsproblem där ZipEngine-rollen har fastnat mellan omstart och upptaget och utlöser ett undantag som anger: Det gick inte att läsa in filen eller sammansättningen "WorkerAssembly – Ett försök gjordes att läsa in ett program med ett felaktigt format.

Ursprunglig produktversion: API Management Service
Ursprungligt KB-nummer: 4464909

Kommentar

I artikeln om Felsökningsserien för Azure Cloud Service är det här det första scenariot i labbet. Kontrollera att du har följt instruktionerna för labbkonfiguration för kompressorprogrammet enligt detta för att återskapa problemet.

Symptom

ZipEngine-rollinstansen av Compressor-programmet loopar ständigt mellan Omstart och Upptagen-tillstånd och genererar nedanstående ohanterade undantag på bladet 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].

Felsökningssteg

Om din roll inte startar eller återanvänds mellan initierings-, upptagen- och stopptillstånden kan koden utlösa ett ohanterat undantag inom en av livscykelhändelserna varje gång rollen startas om. Så om du tittar noga på anropsstacken ovan skulle du märka att ett ohanterat undantag sker via metoden OnStart() för din arbetsroll. Det bästa stället att börja felsöka för den här typen av scenarier är att kontrollera Microsoft Azure-händelseloggar som innehåller viktiga diagnostiska utdata från Microsoft Azure Runtime, inklusive information som rollstarter/stopp, startuppgifter, Start och stopp, OnRun-start, krascher, återvinningar och så vidare.

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()

Nu får du lite mer information om undantaget från Microsoft Azure-händelseloggar som säger att processen som värd för arbetsrollen inte kan läsa in sammansättningen "WorkerAssembly" på grund av System.BadImageFormatException. I allmänhet när en process inte kan läsa in en sammansättning är det alltid en bra idé att samla in fusionsloggar. Gör följande ändringar i registernyckeln under sökvägen HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion för att aktivera fusionsloggning. Ge alla – fullständig behörighet till mappen C:\FusionLogsfusionsloggsökväg .

Skärmbild som visar registernycklarna under Fusion.

När du kontrollerar fusionsloggen för "WorkerAssembly" kan du få mer information för ytterligare felsökning.

*** 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.

Ovanstående markerade felmeddelande i fusionsloggar anger att något är fel i sammansättningens bitness. Om du tittar på den här badImageFormatException-artikeln korrelerar den troligaste orsaken till det här felet med följande:

"En DLL eller körbar fil läses in som en 64-bitars sammansättning, men den innehåller 32-bitars funktioner eller resurser. Den förlitar sig till exempel på COM-interop eller anropar metoder i ett 32-bitars dynamiskt länkbibliotek. Åtgärda det här undantaget genom att ange projektets plattformsmålegenskap till x86 (i stället för x64 eller AnyCPU) och kompilera om."

För att ta reda på sammansättningens bitness kan du köra valfri .NET-dekompilerare. Du kan hitta följande sammansättning efter att du har dekompilera "WorkerAssembly" med hjälp av ILSpy.

Det här är 32-bitars sammansättning (x86).

// C:\WorkerAssembly.dll
// WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Global type:
<Module>
// Architecture: x86
// Runtime: .NET 4.0

Azure är en 64-bitars miljö. Därför fungerar inte .NET-sammansättningar som kompilerats för en 32-bitars målmiljö i Azure. Åtgärda det här undantaget genom att ange projektets plattformsmålegenskap för WorkerAssembly till x64 (i stället för x86 eller AnyCPU) och kompilera om.

Om du granskar koden för WorkerRole.cs för ZipEngine-rollen ser du under två kodrader som faktiskt läste in sammansättningen "WorkerAssembly" och utförde någon funktion. Eftersom det var en 32-bitars sammansättning kunde WaWorkerHost.exe inte läsa in den sammansättningen.

WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.