1.[原]调试DLL卸载时的调试调试l代死锁
2.å¦ä½å¨C#ä¸è°è¯C++åçDLL代ç
[原]调试DLL卸载时的死锁
当程序退出时遭遇卡顿,问题出在DLL卸载时出现死锁。码何码核心在于dll加载时创建的调试调试l代工作线程在卸载时需要等待,但会导致自身陷入死锁。码何码梦导航源码为探索此问题,调试调试l代我们模拟了一个测试案例,码何码java清理其他进程源码并附有相关文件和代码。调试调试l代
关键部分在于主程序WaitDllUnloadExe和DLL程序DllUnload的码何码交互。主程序等待工作线程结束,调试调试l代线程ID为的码何码线程在调用WaitForSingleObject时停滞。进一步查看发现,调试调试l代线程ID1的码何码线程在调用_endthreadex时陷入ntdll!NtWaitForSingleObject的等待,句柄0x指向一个Event对象。调试调试l代播放器源码分析
使用调试命令!cs -l追踪到死锁的码何码核心原因:0号线程(线程ID0x)持有关键段的LockSemaphore,正是调试调试l代1号线程等待的句柄。《windows核心编程》提及,tp5 论坛源码关键段的LockSemaphore是Event类型,从而揭示了死锁的根源:0号线程在DLL_PROCESS_DETACH时等待1号线程,而1号线程在DLL_THREAD_DETACH时又在等待0号线程释放锁,安卓 游戏 拖动 源码形成恶性循环。
值得注意的是,即使在DllMain中使用DisableThreadLibraryCalls也无法解决这个问题,具体细节可参考《windows核心编程》的相应分析。查阅winnt.h中的CriticalSection定义,有助于理解这一现象。
å¦ä½å¨C#ä¸è°è¯C++åçDLL代ç
ç®ååç项ç®ç¨å°äºP/Invokeï¼å¨è°ç¨C++çdllæ¶å¶å°ä¼åçé误ï¼æçæ¯å åæ³æ¼çé®é¢ãä¸å ¶åCode Reviewï¼ä¸å¦ç´æ¥Debug DLLçæºä»£ç ãä¸ç½æäºä¸ä¸ï¼æ¹æ³åºæ¬å·®ä¸å¤ï¼ä½å®é æä½ä¸è¿æ¯æäºä¸è¥¿è¦æ³¨æçã
1.å°DLLæºç å·¥ç¨é¡¹ç®å å ¥ç®åç¨å°çC#å·¥ç¨ç解å³æ¹æ¡ä¸ã
2.设置DLLå·¥ç¨ççæ模å¼ä¸ºDebugï¼Debug模å¼ä¸ä¼çæpdbè°è¯æ件ã
3.设置C#å·¥ç¨ççæ模å¼ä¸ºDebugï¼å¦åæ æ³å½ä¸DLLæºç ä¸çæç¹ã
4.ç±äºDLLå·¥ç¨æ¯ç¬ç«çï¼æ以å°DLLå·¥ç¨çæçdllæ件以åpdbæ件æ·å ¥C#å·¥ç¨çDebugè¾åºç®å½ä¸ã
5.设置æç¹ï¼å¼å§è°è¯ã
release模å¼ä¸æ¯å¯ä»¥è°è¯C#å·¥ç¨çï¼ä½è²ä¼¼æç»å两个工ç¨çreleaseådebug模å¼åç°ï¼åªæ两è é½æ¯debug模å¼ä¸æè½æåã