Compartilhar via


loaderLock MDA

O loaderLock Assistente de depuração gerenciada (MDA) detecta tentativas para executar código gerenciado em um segmento que mantém o bloqueio de carregador do Microsoft Windows do sistema operacional. Qualquer tal execução é ilegal, porque ele pode levar a deadlocks e usar DLLs antes que eles foram inicializados pelo carregador do sistema operacional.

Sintomas

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 como Load ou a primeira chamada para uma plataforma de invocar o método.

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 bloqueio do carregador do sistema operacional para entregar eventos para DLLs afetadas.

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

Causa

Mistos gerenciado/C++ assemblies criados para.NET Framework versões 1.0 ou 1.1 geralmente tentam executar código gerenciado dentro do bloqueio de carregador, a menos que um cuidado especial foi tomado, por exemplo, a vinculação com /NOENTRY. Para obter uma descrição detalhada desses problemas, consulte "Problema de carregamento de DLL misto" em ' Biblioteca MSDN '.

Mistos gerenciado/C++ assemblies criados para.NET Framework versão 2.0 são menos suscetíveis a esses problemas, tendo o mesmo risco reduzido como aplicativos de uso de DLLs não gerenciadas que violam as regras do sistema operacional. Por exemplo, se uma DLL não gerenciada 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 bloqueio do carregador. Para obter mais informações sobre problemas de bloqueio de carregador na.NET Framework versão 2.0 e posterior, consulte Inicialização de Assemblies mistos.

Resolução

No Visual C++.NET 2002 e Visual C++.NET 2003, os DLLs compiladas com o /clr opção de compilador não determinista poderia bloqueio quando carregado; Esse problema foi chamado, o carregamento de DLL misto ou problema de bloqueio do carregador. No Visual C++ 2005 e posteriores, quase todos os não-determinismo foi removido do processo de carregamento de DLL misto. No entanto, existem algumas restantes cenários para qual carregador lock (determinista) pode ocorrer. Para obter uma conta detalhada das causas e resoluções para os problemas de bloqueio de carregador restantes, consulte Inicialização de Assemblies mistos. Esse tópico não identificar o problema de bloqueio de carregador, você precisa examinar a pilha do thread para determinar por que o bloqueio do carregador está ocorrendo e como corrigir o problema. Examine o rastreamento de pilha para o segmento que ativou este MDA. O thread está tentando ilegalmente chamar código gerenciado, mantendo a tecla de bloqueio do carregador do sistema operacional. Provavelmente, você verá uma DLL DllMain ou equivalente entrada aponte na pilha. Regras do sistema operacional para o que você legalmente fazer dentro de um ponto de entrada são bastante limitadas. Essas regras impedem gerenciado de execução.

Efeito sobre o tempo de execução.

Normalmente, os vários segmentos dentro do processo serão bloqueio. Um desses segmentos é provável que seja um responsável pela execução de uma coleta de lixo, portanto, esse deadlock pode ter um grande impacto em todo o processo de thread. Além disso, ela irá impedir que quaisquer operações adicionais que exigem o bloqueio do carregador do sistema operacional, como o carregamento e descarregamento de assemblies ou DLLs e iniciar ou parar de threads.

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

Saída

Este MDA relata que uma execução gerenciada ilegal está sendo tentada. Você precisa examinar a pilha do thread para determinar por que o bloqueio do carregador está ocorrendo e como corrigir o problema.

Configuração

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

Consulte também

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada