로더 잠금 오류


95

C #으로 코드를 작성하여 C ++ dll을 구축하고 있습니다.

오류가 발생합니다.

LoaderLock이 감지되었습니다. 메시지 : OS Loader 잠금 내에서 관리되는 실행을 시도 중입니다. DllMain 또는 이미지 초기화 함수 내에서 관리 코드를 실행하려고하면 응용 프로그램이 중단 될 수 있습니다.

이 오류가 정확히 무엇을 의미하는지 검색하려고 시도했지만 무의미한 기사를 그리는 중이며 대부분 경고 일 뿐이며 Visual Studio에서 해제해야합니다. 다른 솔루션은 ITunes 또는 DirectX로 프로그래밍 할 때 발생하는이 문제로 인한 것 같습니다. 내 문제는 둘 다와 관련이 없습니다.

아무도 이것이 실제로 무엇을 의미하는지 설명 할 수 있습니까?


나는 당신과 함께 느낍니다, 저도 같은 문제를 겪었고, 저를 가장 놀라게하는 것은 무엇입니까? 내 dll은 관리 코드가 아니므로 (존재하지 않는) DllMain에서 관리 코드를 사용하는 이유 / 어떻게해야합니까 ??
Sam

디버그 모드에서 데이터 세트의 내용을 보려고 시도하는 동안이 경고가 표시되었습니다. C #을 사용하고 있는데 일반 Windows 형식에서 발생했습니다.
Soenhay

원인을 파악할 수 없기 때문에 (상위 답변에서 언급했듯이) 범죄를 저지르는 dll 이로 드되고 있다고 생각합니다.
John Thoits 19 년

답변:


70

메뉴 디버그-> 예외로 이동하여 Managed Debugging Assistants를 열고 LoaderLock을 찾아 선택을 취소해야합니다.

http://goo.gl/TGAHV


21
예, 이것은 경고를 끄는 방법입니다. 하지만 2 년이 지난 후에도 정확히 왜 그런 일이 발생했는지 알지 못했습니다.
Devdatta Tengshe 2010

2
이것은 VS 2012 년 오래된 프로젝트를 열 내게 일어난
4imble

1
@Kohan과 함께 있습니다. 이전 프로젝트를 열었고 오류가 발생했습니다. 예외를 비활성화했지만이를 방지하기 위해 수행 할 수있는 작업을 이해하고 싶습니다.
Pimenta 2013

1
프로젝트를 기본 디버깅 (모두 재설정)의 모든 예외와 함께 네이티브 디버깅으로 실행하면 디버그 창에 <mda : msg xmlns : mda = " schemas.microsoft.com/CLR/2004/10/mda "> <!- -OS Loader 잠금 내부에서 관리되는 실행을 시도합니다 .... 등-> <mda : loaderLockMsg break = "true"/> </ mda : msg> VS는 CTOR 시퀀스 동안 여러 중단 점을 표시합니다. LoaderLock 설정을 끄는 것은 도움이되지 않습니다. 저에게는 최상위 MDA 옵션 (모든 MDA의 경우)을 선택한 다음 최상위 옵션 (MDA가없는 경우)을 해제 한 다음 빌드 + 실행해야했습니다. 제 동료에게는 효과가 없었습니다.
GilesDMiddleton 2014 년

17
VS2015에서 업데이트를 공유하려면 이제 Debug->Windows->Exception Settings. 나머지는와 동일합니다Managed Debugging Assistants \ LoaderLock
jxramos

52

로더 잠금의 일반적인 개념 : 시스템은 잠금 내부에서 DllMain의 코드를 실행합니다 (동기화 잠금에서와 같이). 따라서 여기에 설명 된대로 DllMain 내에서 중요하지 않은 코드를 실행하는 것은 "교착 상태에 대한 요청" 입니다.

문제는 왜 DllMain 내에서 코드를 실행하려고합니까? 이 코드가 DllMain의 컨텍스트 내에서 실행되는 것이 중요합니까? 아니면 새 스레드를 생성하고 코드를 실행할 수 있으며 DllMain 내에서 코드 실행이 완료 될 때까지 기다리지 않을 수 있습니까?

특히 관리되는 코드의 문제는 관리되는 코드를 실행하는 데 CLR을로드하는 것과 관련이있을 수 있으며 교착 상태가 발생할 수있는 상황을 알 수 없다는 것입니다. "이 경고를 사용하지 않도록 설정하십시오."라는 조언에주의하지 않을 것입니다. "대부분의 가능성 때문에 내가 당신이라면 일부 시나리오에서 응용 프로그램이 예기치 않게 중단되는 것을 알 수 있습니다.


4
Direct3D 응용 프로그램에서 작업 중입니다. 이것은 EXE입니다. 그러나 여전히이 오류가 표시됩니다. 이 문제를 가장 잘 해결하는 방법이 있습니까?
Agnel Kurian

18

.NET 4.0 및 최신 프레임 워크 업데이트

이것은 혼합 모드 DLL에 대한 지원에 심각한 초기화 문제가 있고 임의의 교착 상태가 발생하기 쉬운 .Net 2.0 당시에 묻는 오래된 질문입니다. .Net 4.0부터 혼합 모드 DLL의 초기화가 변경되었습니다. 이제 두 가지 개별 초기화 단계가 있습니다.

  1. 기본 C ++ 런타임 설정 및 DllMain 메서드 실행을 포함하는 DLL의 진입 점에서 호출되는 기본 초기화.
  2. 시스템 로더에 의해 자동으로 실행되는 관리되는 초기화.

2 단계는 로더 잠금 외부에서 수행되므로 교착 상태가 없습니다. 자세한 내용은 혼합 어셈블리 초기화에 설명되어 있습니다.

혼합 모드 어셈블리를 네이티브 실행 파일에서로드 할 수 있는지 확인하려면 DllMain 메서드가 네이티브 코드로 선언되어 있는지 확인해야합니다. #pragma unmanaged여기에 도움이 될 수 있습니다.

#pragma unmanaged

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
    )
{
    ... // your implementation here
}

DllMain이 직접 또는 간접적으로 호출 할 수있는 코드도 관리되지 않는 것도 중요합니다. DllMain에서 사용하는 기능 유형을 제한하여 DllMain에서 도달 할 수있는 모든 코드를 추적하고 모두 #pragma unmanaged.

컴파일러는 DllMain이 관리되지 않는 것으로 선언되지 않았 음을 감지하면 C4747을 경고하여 약간의 도움을줍니다.

1>  Generating Code...
1>E:\src\mixedmodedll\dllmain.cpp : warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint

그러나 DllMain이 다른 관리 함수를 간접적으로 호출하는 경우 컴파일러는 경고를 생성하지 않으므로 절대 발생하지 않도록해야합니다. 그렇지 않으면 응용 프로그램이 임의로 교착 상태가 될 수 있습니다.


6

ctr d + e를 누른 다음 Managed Debugging Assistants Node를 확장합니다. 그런 다음 LoaderLock을 선택 취소했습니다.

이것이 당신을 도울 것입니다.


단축키는 alt + d + x
Narayan

3
바로 가기는 실제로 처음 실행하는 동안 사용하도록 지정한 구성에 따라 다릅니다. C # 바로 가기 레이아웃은 (Ctrl + D, E)입니다. (또한 옵션-> 환경-> 키보드에서이 기능에 키 조합을 지정할 수 있습니다.)
Adam LS

5

친절하게 그 생각 나게 VS2017 사용자 는 사용 안 함 "을 필요 예외 도우미 대신"의 " 예외 조수 입니다 설정 경로 로더 잠금 오류를 방지하기 위해 (VS2017 전)" Debug-> 예외 . 이 문제를 해결하고 해결책을 찾기 위해 2 시간을 낭비했습니다 ...


"디버그"아래에 "예외"가 없습니다. 내가 VS2017 커뮤니티 15.8.4이
알렉스

@Alex, 디버그-> Windows-> 예외 설정을 확인하거나 Ctrl + Alt + E를 누르십시오
mistika

4

최근에 네이티브 코드로 작성된 COM-Object 인스턴스를 만드는 동안이 오류가 발생했습니다.

m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy"));

이로 인해 설명 된 오류가 발생했습니다. "LoaderLock이 감지되었습니다."예외가 발생했습니다.

추가 스레드에서 개체 인스턴스를 만들어이 오류를 극복했습니다.

ThreadStart threadRef = new ThreadStart(delegate { m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy")); });
Thread myThread = new Thread(threadRef);

myThread.Start();
myThread.Join(); // for synchronization

Remotable 개체 (MarshalByRefObject)에서 오류가 발생할 수 있으며이 솔루션은 해당 개체에 대해 작동하지 않습니다.
Matthieu

3

관리되지 않는 DLL을 호출하고 관리되지 않는 코드를 정의해야하는 C ++ CLR DLL (MSVS2015)을 빌드 중입니다. 나는 #pragma managed와 #pragma unmanaged를 사용하여 주어진 코드 영역에 대한 모드를 제어합니다.

제 경우에는 단순히 DllMain () 앞에 #pragma unmanaged를 넣어 문제가 해결되었습니다. DllMain ()의 관리되는 버전을 원한다고 생각하는 것 같습니다.



2

내 Visual Studio 2017 인스턴스의 설정 경로는 Debug-> Windows-> Exception Settings입니다. 예외 설정 "창"이 하단 탭 그룹 (별도의 창과 반대로)에 표시되어 눈에 띄는 데 시간이 걸렸습니다. "로더"를 검색합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.