织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 杂项技术 > VC(MFC) >

Windows下利用Windbg 分析dump

落鹤生 发布于 2015-12-16 11:01 点击:次 
Windbg中,配置 Symbol File Path: srv*c:\symbols*http://msdl.microsoft.com/download/symbols,可以解决本地找不到 symbol问题。定位一般问题,不是必须。c:\symbols为本地缓存PDB目录。只会同步用到的symbol。
TAG: WinDbg  

概述:

  1. 注册生成dump文件的函数。
  2. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件。
  3. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题。

如下代码生成dump文件(转):

  1. #include <Windows.h> 
  2. #include <stdio.h> 
  3. #include <DbgHelp.h>   
  4. #pragma comment(lib, "dbghelp.lib")  
  5.  
  6. inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)   
  7. {   
  8.     if(pModuleName == NULL)   
  9.     {   
  10.         return FALSE;   
  11.     }   
  12.    
  13.     WCHAR szFileName[_MAX_FNAME] = L"";   
  14.     _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);   
  15.    
  16.     if(wcsicmp(szFileName, L"ntdll") == 0)   
  17.         return TRUE;   
  18.    
  19.     return FALSE;   
  20. }   
  21.    
  22. inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,   
  23.                                       const PMINIDUMP_CALLBACK_INPUT   pInput,   
  24.                                       PMINIDUMP_CALLBACK_OUTPUT        pOutput)   
  25. {   
  26.     if(pInput == 0 || pOutput == 0)   
  27.         return FALSE;   
  28.    
  29.     switch(pInput->CallbackType)   
  30.     {   
  31.     case ModuleCallback:   
  32.         if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)   
  33.             if(!IsDataSectionNeeded(pInput->Module.FullPath))   
  34.                 pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);   
  35.     case IncludeModuleCallback:   
  36.     case IncludeThreadCallback:   
  37.     case ThreadCallback:   
  38.     case ThreadExCallback:   
  39.         return TRUE;   
  40.     default:;   
  41.     }   
  42.    
  43.     return FALSE;   
  44. }   
  45.  
  46. inline void CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName)   
  47. {   
  48.     HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,   
  49.         FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);   
  50.    
  51.     if(hFile != INVALID_HANDLE_VALUE) 
  52.     {   
  53.       MINIDUMP_EXCEPTION_INFORMATION mdei; 
  54.       mdei.ThreadId           = GetCurrentThreadId();   
  55.       mdei.ExceptionPointers  = pep;   
  56.       mdei.ClientPointers     = FALSE;   
  57.    
  58.       MINIDUMP_CALLBACK_INFORMATION mci;   
  59.       mci.CallbackRoutine     = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;   
  60.       mci.CallbackParam       = NULL;   
  61.    
  62.       ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile
  63. , MiniDumpNormal, (pep != NULL) ? &mdei : NULL, NULL, &mci);   
  64.    
  65.       CloseHandle(hFile);   
  66.     }   
  67. }   
  68.  
  69.  
  70. LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)   
  71.   CreateMiniDump(pExceptionInfo, "core.dmp");   
  72.    
  73.   return EXCEPTION_EXECUTE_HANDLER;   

确保程序开始执行如下代码,然后程序崩溃时会调用上面代码创建dump文件:

SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

 

分析生成的dump文件需要如下:

  • 编译程序时生成的PDB,如果是release版本:
    •   需要禁用优化 - VS - Project Property - C/C++ Optimization - Release - Optimization - Disabled
    •   启用生成调试信息 - VS - Project Property - Linker - Debugging - Generate Debug Info - Yes.
  • 代码

 

分析dump文件步骤如下:

  1. 运行Windbg。
  2. 指定PDB文件路径: File - Symbol File Path。多个路径用分号分隔。
  3. 指定代码路径:File - Source File Path
  4. 载入dump文件。
  5. Windbg命令行输入:  !analyze -v
  6. 等待结果 - 函数调用堆栈,程序崩溃代码。busy状态表示正在生成结果。

注释:

  • 没有代码,只有PDB,也可以显示函数调用堆栈,但是不会定位到具体代码。
  • Windbg中,配置 Symbol File Path: srv*c:\symbols*http://msdl.microsoft.com/download/symbols,可以解决本地找不到 symbol问题。定位一般问题,不是必须。c:\symbols为本地缓存PDB目录。只会同步用到的symbol。
  • Windbg的附带工具symchk可以用来下载指定dll的pdb文件:
    • 下载特定dll的pdb文件:symchk /r c:\windows\system32\secur32.dll /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
    • 下载特定目录下的dll的pdb文件:symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
  • 如果dump文件被拷贝到编译程序的机器上,无需指定代码路径,只需指定pdb文件,可自动定位代码。
(playerken)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201512/17425.html]
本文出处:博客园 作者:playerken 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容