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

posted @ 2018-05-23 09:21  傍风无意  阅读(360)  评论(0编辑  收藏  举报