【梦导航源码】【java清理其他进程源码】【播放器源码分析】调试dll源码_如何调试dll代码

时间:2024-11-25 03:23:57 来源:聊天 源码 编辑:apollo 源码怎样阅读

1.[原]调试DLL卸载时的调试调试l代死锁
2.如何在C#中调试C++写的DLL代码

调试dll源码_如何调试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模式下才能成功。

copyright © 2016 powered by 皮皮网   sitemap