Compartilhar via


A função ZipEngine está presa entre a reinicialização e o estado ocupado

Este artigo fornece informações sobre a solução de problemas em que a função ZipEngine está presa entre Reiniciar e o estado ocupado e gerar uma exceção informando: Não foi possível carregar o arquivo ou o assembly 'WorkerAssembly - Foi feita uma tentativa de carregar um programa com um formato incorreto.

Versão original do produto: Gerenciamento de API Service
Número de KB original: 4464909

Observação

Consulte o artigo sobre a Série de Solução de Problemas do Serviço de Nuvem do Azure, este é o primeiro cenário do laboratório. Verifique se você seguiu as instruções de instalação do laboratório para o aplicativo Compressor de acordo com isso, para recriar o problema.

Sintomas

A instância de função ZipEngine do aplicativo Compressor está constantemente em loop entre reiniciar e o estado ocupado lançando a exceção abaixo sem tratamento na folha portal do Azure:

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

Solucionar problemas de etapas

Se sua função não for iniciada ou estiver reciclando entre os estados inicializados, ocupados e parados, seu código poderá estar gerando uma exceção sem tratamento em um dos eventos do ciclo de vida sempre que a função for reiniciada. Portanto, se você analisar cuidadosamente a pilha de chamadas acima, perceberá que uma exceção não tratada está sendo feita por meio do método OnStart() de sua função de trabalho. O melhor lugar para começar a solução de problemas para esse tipo de cenários é marcar Logs de Eventos do Microsoft Azure que contém a saída de diagnóstico chave do Microsoft Azure Runtime, incluindo informações como início/paradas de função, tarefas de inicialização, início e parada do OnStart, início de OnRun, falhas, reciclagems e assim por diante.

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

Agora você obtém um pouco mais de detalhes sobre a exceção dos Logs de Eventos do Microsoft Azure dizendo que a função de trabalho de hospedagem do processo não é capaz de carregar o assembly 'WorkerAssembly' devido ao System.BadImageFormatException. Em geral, quando um processo não é capaz de carregar um assembly, é sempre uma boa prática capturar logs do Fusion. Faça as seguintes alterações na chave do registro no caminho HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion para habilitar o registro em log de fusão. Dê permissão a Todos – Controle Total para a pasta C:\FusionLogscaminho do log de fusão .

A captura de tela mostra as chaves do registro em Fusion.

Ao verificar o log de fusão de 'WorkerAssembly', você poderá obter mais informações para solução de problemas adicionais.

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

A mensagem de erro realçada acima nos logs de fusão afirma que algo está errado na bitness do assembly. Se você analisar este artigo BadImageFormatException , a causa mais provável desse erro se correlaciona com isso:

"Uma DLL ou executável é carregada como um assembly de 64 bits, mas contém recursos ou recursos de 32 bits. Por exemplo, ele depende de métodos de interoperabilidade ou chamadas COM em uma biblioteca de link dinâmico de 32 bits. Para resolver essa exceção, defina a propriedade de destino plataforma do projeto como x86 (em vez de x64 ou AnyCPU) e recompile."

Para descobrir a bit do assembly, você pode executar qualquer descompilador do .NET de sua escolha. Você pode encontrar o assembly a seguir depois de descompilar 'WorkerAssembly' usando ILSpy.

Este é o assembly de 32 bits (x86).

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

O Azure é um ambiente de 64 bits. Portanto, os assemblies .NET compilados para um destino de 32 bits não funcionarão no Azure. Para resolver essa exceção, defina a propriedade de destino plataforma do projeto 'WorkerAssembly' como x64 (em vez de x86 ou AnyCPU) e recompile.

Se você revisar o código do WorkerRole.cs para a função ZipEngine, observará abaixo duas linhas de código que estavam carregando o assembly 'WorkerAssembly' e executando alguma função. Como era um assembly de 32 bits, o WaWorkerHost.exe não foi capaz de carregar esse assembly.

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

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.