WinDbg调试包含Duilib和ProtoBuffer开源库的工程
1. 问题: 逐行代码屏蔽发现LoadLibrary / FreeLibrary导致Debug退出时Output窗口报N多内存泄漏提示
1)由于很多Dll调用了MFC就想着将该接口换成Afx-LoadLibrary / FreeLibrary,问题依然存在
2)在LoadLibrary后再加上GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, (LPCTSTR)hModal, &hModal);问题仍然存在;
解决:想想Duilib应该没有问题,报的错误中包含google.protobuffer相关的错误,预测可能这个相关的库有问题,在界面退出的析构函数中加上google::protobuf::ShutdownProtobufLibrary(); 这样在FreeLibrary后报的错误基本消失,问题解决。
2. 问题:用WindDBG Attach要调试的进程/目标程序,在多次操作界面后发生EH异常如:
(6344.18658): C++ EH exception - code e06d7363 (first chance)
Thread suspend failed, Win32 error 0n2
解决:输入.ext -1显示异常地址,c++异常的捕获,然后再用lsa指令跟踪出问题代码的位置
3. 问题:程序的Debug版本多次操作后运行正常(GDI对象的数量稳定,使用内存大小稳定),但Rlease版本多次操作后内存暴涨,最大占用2G内存
1)加载在通过任务管理器产生的Dmp文件,在WinDbg中加载该Dmp文件;
2)加载与该Dmp文件相关的所有pdb文件:.reload /i /f ,并查看加载结果:lm;
3)自动分析指令(通常分析出的是主线程的堆栈):!analyze -v 此时通过分析出的堆栈去找有无kernel32!UnhandledExceptionFilter信息
如果有,则此堆栈(主线程堆栈)为异常堆栈;
如果没有,则需查看所有线程堆栈:
查看所有线程堆栈:~*kb
同理去找有无kernel32!UnhandledExceptionFilter信息堆栈
如果有,则此堆栈为异常堆栈;
----------------------------------如果查看的线程堆栈没有跟该进程相关的信息,说明需要将windbg切换到32位模式,才能分析-----------------------------
- .load wow64exts
- !sw
4)注意事项:WinDbg老提示SOS does not support the current target architecture,此处多次加载.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll(C#程序), C:\Program Files (x86)\Debugging Tools for Windows\clr10\sos.dll(C++程序)均有这个提示,耽误较多时间
解决方法:原因在于使用了64位的任务管理器导出了32位进程的dump文件,下面是两个解决方法:1、使用32位任务管理器,运行:C:\Windows\SysWOW64\taskmgr.exe。2、使用其它转储工具,比如:ProcessExplorer
也就是说生成dmp文件也必须是32位的,需要重新生成
5)切换到异常堆栈的线程ID: ~[线程Num]+s