出错信息为: 检测到LoaderLock,正试图在OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码,这样会导致应用程序挂起。 ...解决办法: 在"Debug"菜单下----"Exceptions"----"Managed Debugging Assistants"中勾掉"LoaderLock" 说明: ....NET2.0中增加了42种非常强大的调试助手(MDA),Loaderlock是其中之一。...Loaderlock检测在一个拥有操作系统loader lock的线程上运行托管代码的情况。这样做有可能会引起死锁,并且有可能在操作系统加载器初始化DLL前被使用。
Loaderlock 是当中之中的一个。Loaderlock检測在一个拥有操作系统loader lock的线程上执行托管代码的情况。这样做有可能会引起死锁。...解决方式一: 1、把VS菜单的 调试->异常->Managed Debuggin Assistants->LoaderLock 的选中状态去掉。...3、快捷键Ctrl+Alt+E,改动Managed Debuggin Assistants->LoaderLock 的选中状态去掉。
如果占用了LoaderLock临界区的线程在等待一个需要经过临界区才能结束的线程时,就发生了死锁。以上3篇博文中均有案例。...G 同步对象 如果该同步对象的释放需要获得PEB中的LoaderLock,而占用该临界区的线程又要去等待这个同步对象,则会死锁。其实F中的线程也算是个同步对象。...该函数一开始便进入了PEB中LoaderLock临界区,在该临界区中根据PEB中LDR的InMemoryOrderModuleList遍历加载的DLL,然后判断该DLL信息的Flags字段是否或上了0x40000
Message=托管调试助手 "LoaderLock":“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”...中断提示,如下图所示; 解决办法: 快捷键Ctrl+Alt+E,改动Managed Debuggin Assistants->LoaderLock 的选中状态去掉。
abstractCache, key); while (true) { boolean create[] = new boolean[1]; LoaderLock...loaderMap.computeIfAbsent(lockKey, (unusedKey) -> { create[0] = true; LoaderLock...loaderLock = new LoaderLock(); loaderLock.signal = new CountDownLatch(1);...loaderLock.loaderThread = Thread.currentThread(); return loaderLock; });...AbstractCache提供了synchronizedLoad静态方法,它先通过buildLoaderLockKey来创建lockKey,之后while循环,computeIfAbsent指定lockKey的LoaderLock
.dll 中的 StringFromGUID2 函数,此时进程还未完成找到函数入口点的工作,所以需要调用 LoadLibraryEx 或 GetProcAddress 去获取此函数的入口点,需要申请 LoaderLock.../magazine/ms172219(VS.80).aspx 可知 LoadLibrary、GetProcAddress、FreeLibrary 和 GetModuleHandle 等函数是需要申请 LoaderLock...辅助线程在调用 GetMessage 时被注入 TaobaoProtectSE.dll,已获取 LoaderLock 去 LoadLibraryEx 该 DLL 和执行 DLL 的入口函数,由于此 DLL...即主线程进入了临界区,要申请 LoaderLock;辅助线程获取了 LoaderLock,要申请进入临界区,形成死锁。...解决方案: 让 SHGetFolderPathW 的首次调用在起辅助线程之前就完成,再次调用它时应该不需要再寻找函数入口点,不需要再申请 LoaderLock 即可消除死锁风险。
我们看到GetModuleFileName在内部要调用LdrLockLoderLock,以进入PEB的LoaderLock临界区。...并在加载器函数中进入了LdrLockLoderLock,该函数内部要进入PEB的LoaderLock临界区。
LdrpInLdrInit == FALSE ) { RtlEnterCriticalSection((PRTL_CRITICAL_SECTION)NtCurrentPeb()->LoaderLock...LdrpInLdrInit == FALSE ) { RtlLeaveCriticalSection((PRTL_CRITICAL_SECTION)NtCurrentPeb()->LoaderLock...= (PVOID)&LoaderLock; if ( !...(&LoaderLock); } else { // // drop into a 30ms delay loop...} } …… LdrpInitializeThread(Context); …… RtlLeaveCriticalSection(&LoaderLock
PDLL_INIT_ROUTINE InitRoutine; PLIST_ENTRY Next; Peb = NtCurrentPeb(); RtlEnterCriticalSection(&LoaderLock...DLL_THREAD_DETACH); } LdrpFreeTls(); } finally { RtlLeaveCriticalSection(&LoaderLock
: UChar +0x001 ReadImageFileExecOptions : UChar …… +0x09c GdiDCAttributeList : Uint4B +0x0a0 LoaderLock...: Ptr32 Void +0x0a4 OSMajorVersion : Uint4B 可以发现该结构体偏移0xa0处是一个名字为LoaderLock的变量。 ...在该文中多处对这个锁的说明值暗示这个锁是PEB中的LoaderLock。 那么刚才为什么要*(_DWORD *)(v4 + 0xa0) = &LdrpLoaderLock;?
; // 98h PVOID GdiDCAttributeList; // 9Ch PVOID LoaderLock
6 dt _PEB 0x7ffdc000 寻找LoaderLock的指针(0x7c99e0174) ?
GdiSharedHandleTable; PVOID ProcessStarterHelper; ULONG GdiDCAttributeList; PRTL_CRITICAL_SECTION LoaderLock
ProcessStarterHelper : 0x0 [Type: void *] [+0x09c] GdiDCAttributeList : 0x0 [Type: unsigned long] [+0x0a0] LoaderLock
+098 void *ProcessStarterHelper +09c uint32 GdiDCAttributeList +0a0 void *LoaderLock...index = 0x09c self.GdiDCAttributeList = self.PEB[index:index+4] index = 0x0a0 self.LoaderLock
+098 void *ProcessStarterHelper +09c uint32 GdiDCAttributeList +0a0 void *LoaderLock...0x09c self.GdiDCAttributeList = self.PEB[index:index+4] index = 0x0a0 self.LoaderLock
logger = LoggerFactory.getLogger(AbstractCache.class); private volatile ConcurrentHashMapLoaderLock
领取专属 10元无门槛券
手把手带您无忧上云