Exportar (0) Imprimir
Expandir Tudo
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original

loaderLock MDA

The loaderLock Assistente de depuração gerenciada (MDA) detecta tentativas para executar código gerenciado em um thread que contém o bloquear de carregador do sistema operacional Microsoft Windows. Qualquer tal execução é ilegal, pois ele poderá resultar em travamentos e o uso de DLLs antes de ter sido inicializadas pelo carregador do sistema operacional.

A falha mais comum durante a execução de código dentro do bloqueio do carregador do sistema operacional é que segmentos sofrerão deadlock durante a tentativa de chamar outras funções do Win32 que também requerem o bloqueio de carregador. Exemplos de tais funções são LoadLibrary, GetProcAddress, FreeLibrary e GetModuleHandle. O aplicativo não pode chamar diretamente essas funções; o Common Language Runtime (CLR) pode chamar essas funções como resultado de uma chamada de nível superior Load ou a primeira chamada para um método platform invoke.

Os deadlocks também podem ocorrer se um thread está aguardando que outro thread iniciar ou terminar. Quando um thread inicia ou termina a execução, ele deve adquirir o bloquear do carregador do sistema operacional para entregar eventos às DLLs afetadas.

Finalmente, há casos em que chamadas para DLLs podem ocorrer antes que as DLLs foram inicializadas corretamente pelo carregador do sistema operacional. Ao contrário das falhas de deadlock, que podem ser diagnosticadas examinando as pilhas de todos os threads envolvidos no deadlock, é muito difícil diagnosticar o uso de DLLs não inicializados sem utilizar este MDA.

Misto assemblies C++ gerenciados/não gerenciados, criados para versões do .NET estrutura 1.0 ou 1.1 geralmente tentam executar código gerenciado dentro do bloquear de carregador, a menos que um cuidado especial foi tomado, por exemplo, vinculação com /NOENTRY. Para obter uma descrição detalhada desses problemas, consulte "Misto DLL carregando problema" na biblioteca MSDN.

Mistos gerenciado/não gerenciado C++ assemblies criados para o .NET estrutura versão 2.0 são menos suscetíveis a esses problemas, tendo o mesmo risco reduzido sistema autônomo aplicativos de uso de DLLs não gerenciadas que violam sistema autônomo regras do sistema operacional. Por exemplo, se um não-gerenciado DllMain chamadas de ponto de entrada CoCreateInstance Para obter um objeto gerenciado que foi exposto a COM, o resultado é uma tentativa de executar código gerenciado dentro do bloquear de carregador.

Examine o rastreamento da pilha para o segmento que ativou este MDA. O thread está tentando chamar ilegalmente em código gerenciado, mantendo o bloquear do carregador do sistema operacional. Você provavelmente verá DllMain ou ponto de entrada equivalente na pilha. Regras do sistema operacional para o que pode ser legalmente feito de dentro de um ponto de entrada são bastante limitadas. Essas regras impedem qualquer execução gerenciada.

Normalmente, vários threads dentro do processo serão deadlock. Um desses threads é provável que haja um thread responsável por executar uma coleta de lixo, para que esse deadlock possa ter um impacto significativo sobre o processo inteiro. Além disso, ela irá impedir que quaisquer operações adicionais requerem bloquear do carregador do sistema operacional, como o carregamento e descarregamento de assemblies ou DLLs e iniciando ou parando threads.

Em alguns casos incomuns, também é possível para problemas semelhantes para ser disparado em DLLs que são chamadas antes de ter sido inicializadas ou violações de acesso.

Este MDA relata que uma ilegal gerenciado tentativa de execução. Você precisa examinar a pilha do thread para determinar por que o bloquear de carregador está ocorrendo e como corrigir o problema.

<mdaConfig>
  <assistants>
    <loaderLock/>
  </assistants>
</mdaConfig>

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft