FreeLibrary函数卡死,请教大牛指点

nana_aoe_2013 2013-08-19 10:03:12
调试公司的代码,一个动态库导出一个类,在卸载动态库的时候调用FreeLibrary,FreeLibrary卡死在里面。
下面详细描述一下场景和我的一些看法:
1、动态库是用MFC生成的,也就是说DllMain是被封装起来的,我不会改其中的加载/卸载函数。
2、在动态库卸载前,我已确认将导出类对象删除,及时不删除,应该出现崩溃现象才对。

现在没有什么好的思路,请各位指点一下,给个方向也好。
...全文
1449 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiao845068232 2013-11-17
  • 打赏
  • 举报
回复
兄弟你这问题解决了吗?我也遇到同样的问题
nana_aoe_2013 2013-09-03
  • 打赏
  • 举报
回复
这,结贴吧,没有得到想要的答案,说明,我的工程是MFC DLL,不是Dll工程,DllMain我是找不到,可能高人能找到吧,这个死锁的问题,慢慢研究
hemmingway 2013-08-30
  • 打赏
  • 举报
回复
一般用过loadlibrary才用FreeLibrary,不然可以不用的啊
davidyu720 2013-08-30
  • 打赏
  • 举报
回复

//////////////////////////////////////////////////////////////////////////
//
//	Entry-Point Function: the first code to execute, also the last code.
//
BOOL APIENTRY DllMain(HMODULE hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved
					  )
{
	switch(ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		//TODO
		return TRUE;

	case DLL_PROCESS_DETACH:
		//TODO
		return TRUE;

	case DLL_THREAD_ATTACH:
		//TODO
		return TRUE;

	case DLL_THREAD_DETACH:
		//TODO
		return TRUE;

	default:
		return TRUE;
	}
}
nana_aoe_2013 2013-08-29
  • 打赏
  • 举报
回复
引用 13 楼 xuddk727 的回复:
以DLL工程调试,看看是不是DETACH的时候做了什么卡住了
如何调,请指教。
nana_aoe_2013 2013-08-29
  • 打赏
  • 举报
回复
引用 15 楼 lm_whales 的回复:
MFC 有源码的!!!
请教如何看源码
lm_whales 2013-08-21
  • 打赏
  • 举报
回复
MFC 有源码的!!!
Eleven 2013-08-20
  • 打赏
  • 举报
回复
DllMain函数中是怎么写的?
琅琊榜 2013-08-20
  • 打赏
  • 举报
回复
dllmain函数中应该是有问题的
wangk 2013-08-20
  • 打赏
  • 举报
回复
引用 2 楼 nana_aoe 的回复:
我用windbg 分析dump文件,没有看到多个线程争夺锁的情况,有可能是某个线程锁没释放就把线程干掉了的情况,但是不好验证。给个方法。
如果你确实正确的用Windbg扫描,没有死锁。 有可能是Dll释放时清理资源出现死循环,到不一定是锁住 你最好看看windbg释放线程的堆栈。
oyljerry 2013-08-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/breaksoftware/article/details/8159088
smwhotjay 2013-08-20
  • 打赏
  • 举报
回复
大概在dllmain里 处理dll释放 卡住了. 自己打log吧.
fishion 2013-08-20
  • 打赏
  • 举报
回复
创建个新工程,只加载dll,然后释放,看看情况,调用dll中的类方法再释放看看情况。而且FreeLibrary应该都不用主动调用的吧
许文君 2013-08-20
  • 打赏
  • 举报
回复
以DLL工程调试,看看是不是DETACH的时候做了什么卡住了
nana_aoe_2013 2013-08-20
  • 打赏
  • 举报
回复
引用 9 楼 xuddk727 的回复:
既然不是锁住,那你有没有dll源代码,查看下它detach的时候是否做了什么,
有dll源码,但是是MFC工程,怎么看内部结构?》
nana_aoe_2013 2013-08-20
  • 打赏
  • 举报
回复
引用 8 楼 lm_whales 的回复:
MFC 使用 AfxLoadLibary
这个动态库工程虽然是MFC建立的,但是内部没有使用MFC的东西,全部是C++的, 不过你说的这个方法我也试过了,没有效果, 似乎不是这的问题,谢谢了
nana_aoe_2013 2013-08-20
  • 打赏
  • 举报
回复
引用 3 楼 fishion 的回复:
创建个新工程,只加载dll,然后释放,看看情况,调用dll中的类方法再释放看看情况。而且FreeLibrary应该都不用主动调用的吧
使用显式加载动态库LoadLibrary,就一定要主动调用FreeLibrary释放Dll,虽然不释放也不会出现问题,那就和Malloc后不free,交给操作系统处理一样了,这样会提示句柄泄露的。
许文君 2013-08-20
  • 打赏
  • 举报
回复
既然不是锁住,那你有没有dll源代码,查看下它detach的时候是否做了什么,
lm_whales 2013-08-20
  • 打赏
  • 举报
回复
MFC 使用 AfxLoadLibary
nana_aoe_2013 2013-08-19
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
是不是线程死锁了
我用windbg 分析dump文件,没有看到多个线程争夺锁的情况,有可能是某个线程锁没释放就把线程干掉了的情况,但是不好验证。给个方法。
加载更多回复(1)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧