loaderLock MDAloaderLock MDA

loaderLock マネージ デバッグ アシスタント (MDA) は、Microsoft Windows オペレーティング システムのローダー ロックを保持しているスレッド上でマネージ コードを実行する試行を検出します。The loaderLock managed debugging assistant (MDA) detects attempts to execute managed code on a thread that holds the Microsoft Windows operating system loader lock. このような実行は、デッドロックの原因になる可能性があり、オペレーティング システムのローダーが初期化する前に DLL が使用される可能性があるため、不適切です。Any such execution is illegal because it can lead to deadlocks and to use of DLLs before they have been initialized by the operating system's loader.

現象Symptoms

オペレーティング システムのローダー ロック内でコードを実行する場合に発生する最も一般的なエラーは、ローダー ロックを必要とする他の Win32 関数を呼び出そうとしたときにスレッドがデッドロックする問題です。The most common failure when executing code inside the operating system's loader lock is that threads will deadlock when attempting to call other Win32 functions that also require the loader lock. このような関数の例として、LoadLibraryGetProcAddressFreeLibraryGetModuleHandle があります。Examples of such functions are LoadLibrary, GetProcAddress, FreeLibrary, and GetModuleHandle. アプリケーションはこれらの関数を直接呼び出さない可能性があります。Load など高位の呼び出しや、プラットフォーム呼び出しメソッドの最初の呼び出しの結果として共通言語ランタイム (CLR) からこれらの関数が呼び出される可能性があります。The application might not directly call these functions; the common language runtime (CLR) might call these functions as the result of a higher level call like Load or the first call to a platform invoke method.

スレッドが別スレッドの開始または完了を待機している場合にもデッドロックが発生する可能性があります。Deadlocks can also occur if a thread is waiting for another thread to start or finish. スレッドが実行を開始または完了した場合、影響を受ける DLL にイベントを配信するためにオペレーティング システムのローダー ロックを獲得する必要があります。When a thread starts or finishes executing, it must acquire the operating system's loader lock to deliver events to affected DLLs.

最後に、オペレーティング システムのローダーが DLL を適切に初期化する前に、それらの DLL の呼び出しが発生する場合があります。Finally, there are cases where calls into DLLs can occur before those DLLs have been properly initialized by the operating system's loader. デッドロック エラーの場合、デッドロックに関係する全スレッドのスタックを調べることで診断できますが、この MDA を使用せずに初期化されていない DLL の使用を診断することは非常に困難です。Unlike the deadlock failures, which can be diagnosed by examining the stacks of all the threads involved in the deadlock, it is very difficult to diagnose the use of uninitialized DLLs without using this MDA.

原因Cause

.NET Framework バージョン 1.0 または 1.1 用に構築されたマネージ/アンマネージ混在 C++ アセンブリの場合、特別な措置 (/NOENTRY とリンクするなど) を取っていなければ、一般的にローダー ロック内でマネージ コードを実行しようとします。Mixed managed/unmanaged C++ assemblies built for .NET Framework versions 1.0 or 1.1 generally attempt to execute managed code inside the loader lock unless special care has been taken, for example, linking with /NOENTRY.

.NET Framework バージョン 2.0 用に構築されたマネージ/アンマネージ混在 C++ アセンブリの場合、このような問題の影響をあまり受けません。オペレーティング システムのルールに違反するアンマネージ DLL を使用するアプリケーションと同程度に少ないリスクです。Mixed managed/unmanaged C++ assemblies built for .NET Framework version 2.0 are less susceptible to these problems, having the same reduced risk as applications using unmanaged DLLs that violate the operating system's rules. たとえば、アンマネージ DLL の DllMain エントリ ポイントが CoCreateInstance を呼び出して、COM に公開されているマネージ オブジェクトを取得する場合、結果として、ローダー ロック内のマネージ コードを実行することになります。For example, if an unmanaged DLL's DllMain entry point calls CoCreateInstance to obtain a managed object that has been exposed to COM, the result is an attempt to execute managed code inside the loader lock. .NET Framework バージョン 2.0 以降のローダー ロックの問題については、「混在アセンブリの初期化」を参照してください。For more information about loader lock issues in the .NET Framework version 2.0 and later, see Initialization of Mixed Assemblies.

解像度Resolution

Visual C++ .NET 2002 および Visual C++ .NET 2003 では、/clr コンパイラ オプションを指定してコンパイルされた DLL は、読み込み時に非確定的にデッドロックを生じる可能性があります。この問題は、混在モード DLL 読み込み時の問題 (またはローダー ロックの問題) と呼ばれていました。In Visual C++ .NET 2002 and Visual C++ .NET 2003, DLLs compiled with the /clr compiler option could non-deterministically deadlock when loaded; this issue was called the mixed DLL loading or loader lock issue. Visual C++ 2005 以降の場合、混在モード DLL の読み込みプロセスで、このような確定的でない場合の問題はほとんどなくなりました。In Visual C++ 2005 and later, almost all non-determinism has been removed from the mixed DLL loading process. ただし、ローダー ロックが (確定的に) 発生する可能性のあるシナリオはいくつか残っています。However, there are a few remaining scenarios for which loader lock can (deterministically) occur. その他のローダー ロック問題の原因と解決策の詳細については、「混在アセンブリの初期化」を参照してください。For a detailed account of the causes and resolutions for the remaining loader lock issues, see Initialization of Mixed Assemblies. このトピックでローダー ロックの問題が特定できない場合は、スレッドのスタックを調べて、ローダー ロックが発生している理由と問題の解決方法を判断する必要があります。If that topic does not identify your loader lock problem, you have to examine the thread's stack to determine why the loader lock is occurring and how to correct the problem. この MDA をアクティブにしたスレッドのスタック トレースを確認してください。Look at the stack trace for the thread that has activated this MDA. オペレーティング システムのローダー ロックを保持しているときに、スレッドが不正にマネージ コードを呼び出そうとしています。The thread is attempting to illegally call into managed code while holding the operating system's loader lock. スタックに DLL の DllMain または同等のエントリ ポイントが存在するはずです。You will probably see a DLL's DllMain or equivalent entry point on the stack. このようなエントリ ポイント内から実行が許可されることについて、オペレーティング システムのルールは非常に制限されています。The operating system's rules for what you can legally do from inside such an entry point are quite limited. オペレーティング システムのルールでは、あらゆるマネージ実行が除外されています。These rules preclude any managed execution.

ランタイムへの影響Effect on the Runtime

通常、プロセス内の複数のスレッドでデッドロックが発生します。Typically, several threads inside the process will deadlock. 多くの場合、このようなスレッドの 1 つはガベージ コレクションの実行を担当しているため、このデッドロックによってプロセス全体に重大な影響が及ぶ可能性があります。One of those threads is likely to be a thread responsible for performing a garbage collection, so this deadlock can have a major impact on the entire process. さらに、オペレーティング システムのローダー ロックが必要な追加の操作も実行できなくなります。たとえば、アセンブリの読み込みまたはアンロード、スレッドの開始や終了などの操作です。Furthermore, it will prevent any additional operations that require the operating system's loader lock, like loading and unloading assemblies or DLLs and starting or stopping threads.

まれではありますが、初期化される前に呼び出された DLL で、アクセス違反などの問題が発生する可能性もあります。In some unusual cases, it is also possible for access violations or similar problems to be triggered in DLLs which are called before they have been initialized.

出力Output

この MDA は、不正なマネージ実行が試行されていることを報告しています。This MDA reports that an illegal managed execution is being attempted. スレッドのスタックを調べて、ローダー ロックが発生している理由と問題の解決方法を判断する必要があります。You need to examine the thread's stack to determine why the loader lock is occurring and how to correct the problem.

構成Configuration

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

関連項目See Also

マネージ デバッグ アシスタントによるエラーの診断Diagnosing Errors with Managed Debugging Assistants