调试公司的代码,一个动态库导出一个类,在卸载动态库的时候调用FreeLibrary,FreeLibrary卡死在里面。
下面详细描述一下场景和我的一些看法:
1、动态库是用MFC生成的,也就是说DllMain是被封装起来的,我不会改其中的加载/卸载函数。
2、在动态库卸载前,我已确认将导出类对象删除,及时不删除,应该出现崩溃现象才对。现在没有什么好的思路,请各位指点一下,给个方向也好。

解决方案 »

  1.   

    我用windbg 分析dump文件,没有看到多个线程争夺锁的情况,有可能是某个线程锁没释放就把线程干掉了的情况,但是不好验证。给个方法。
      

  2.   

    创建个新工程,只加载dll,然后释放,看看情况,调用dll中的类方法再释放看看情况。而且FreeLibrary应该都不用主动调用的吧
      

  3.   

    大概在dllmain里 处理dll释放 卡住了. 自己打log吧.
      

  4.   


    如果你确实正确的用Windbg扫描,没有死锁。
    有可能是Dll释放时清理资源出现死循环,到不一定是锁住
    你最好看看windbg释放线程的堆栈。
      

  5.   

    MFC 使用 AfxLoadLibary
      

  6.   

    既然不是锁住,那你有没有dll源代码,查看下它detach的时候是否做了什么,
      

  7.   


    使用显式加载动态库LoadLibrary,就一定要主动调用FreeLibrary释放Dll,虽然不释放也不会出现问题,那就和Malloc后不free,交给操作系统处理一样了,这样会提示句柄泄露的。
      

  8.   

    这个动态库工程虽然是MFC建立的,但是内部没有使用MFC的东西,全部是C++的,
    不过你说的这个方法我也试过了,没有效果, 似乎不是这的问题,谢谢了
      

  9.   


    有dll源码,但是是MFC工程,怎么看内部结构?》
      

  10.   

    以DLL工程调试,看看是不是DETACH的时候做了什么卡住了
      

  11.   

    http://blog.csdn.net/breaksoftware/article/details/8159088
      

  12.   


    //////////////////////////////////////////////////////////////////////////
    //
    // 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;
    }
    }
      

  13.   

    一般用过loadlibrary才用FreeLibrary,不然可以不用的啊
      

  14.   

    这,结贴吧,没有得到想要的答案,说明,我的工程是MFC DLL,不是Dll工程,DllMain我是找不到,可能高人能找到吧,这个死锁的问题,慢慢研究