WinDbg 和 Dump 文件的使用

产品经过漫长的花期,即将结果。面临市场,面对用户,总有很多很多莫名奇妙的问题,让你每天不得不花大量的精力和时间在 bug 上面,我想问题最难的莫过于,问题的随机性,偶尔出现,无法捕捉。放假这几天在网络上逛了一圈,有些收获,也有惊喜,有些无法消化,便于以后记忆,按照鲁迅先生的拿来主义,拿来再说,大杂烩的笔记,以后有机会再作整理,文字大部分来自网络,感谢广大网友们的分享,感谢你们的无私。


1.正确的使用方法

将崩溃程序的dmp, pdb,exe文件都放在同一个目录下,然后双击运行dmp,(或者用VS打开),然后就会出现一个名为dumpfile的解决方案并且包含一个dumpfile的工程,此时右键点击此工程,选择调试->启动新实例(或者启动并进入单步调试新实例)都行,此时程序会自动的调到源码中崩溃的那一行,并且在call stack中有完整的堆栈信息,并且临时变量的值也可以通过VS显示出来,还有模块信息,线程信息

http://blog.youkuaiyun.com/vagrxie/archive/2009/07/31/4398721.aspx

 

C++ Core dump问题定位方法

http://wenku.baidu.com/view/3b49ffdba58da0116c174962.html

2. WinDbg下载:

Install Debugging Tools for Windows 32-bit Version

http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

3. 生成 dump 的源码。

  1. #include <stdio.h>   
  2. #include <windows.h>   
  3. #include <dbghelp.h>   
  4. #pragma comment(lib, "Dbghelp.lib")   
  5.   
  6. LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo)  
  7. {  
  8.     LONG ret = EXCEPTION_EXECUTE_HANDLER;  
  9.     TCHAR szFileName[64];  
  10.     SYSTEMTIME st;  
  11.     ::GetLocalTime(&st);  
  12.     wsprintf(szFileName, TEXT("%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand()%100);  
  13.     HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );  
  14.     if (hFile != INVALID_HANDLE_VALUE)  
  15.     {  
  16.         MINIDUMP_EXCEPTION_INFORMATION ExInfo;          
  17.         ExInfo.ThreadId = ::GetCurrentThreadId();         
  18.         ExInfo.ExceptionPointers = lpExceptionInfo;          
  19.         ExInfo.ClientPointers = false;         
  20.         // write the dump           
  21.         BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );          if (bOK)  
  22.         {  
  23.             printf("Create Dump File Success!/n");  
  24.         }  
  25.         else  
  26.         {  
  27.             printf("MiniDumpWriteDump Failed: %d/n", GetLastError());  
  28.         }  
  29.         ::CloseHandle(hFile);  
  30.     }  
  31.     else  
  32.     {  
  33.         printf("Create File %s Failed %d/n", szFileName, GetLastError());  
  34.     }  
  35.     return ret;  
  36. }  
#include <stdio.h>
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")

LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
    LONG ret = EXCEPTION_EXECUTE_HANDLER;
    TCHAR szFileName[64];
    SYSTEMTIME st;
    ::GetLocalTime(&st);
    wsprintf(szFileName, TEXT("%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand()%100);
    HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    if (hFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION ExInfo;        
        ExInfo.ThreadId = ::GetCurrentThreadId();       
        ExInfo.ExceptionPointers = lpExceptionInfo;        
        ExInfo.ClientPointers = false;       
        // write the dump        
        BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );          if (bOK)
        {
            printf("Create Dump File Success!/n");
        }
        else
        {
            printf("MiniDumpWriteDump Failed: %d/n", GetLastError());
        }
        ::CloseHandle(hFile);
    }
    else
    {
        printf("Create File %s Failed %d/n", szFileName, GetLastError());
    }
    return ret;
}

4.调用

  1. int main()  
  2. {  
  3.     ::SetUnhandledExceptionFilter(MyUnhandledFilter);  
  4.     int *p;*p = 100;  
  5.     return 0;  
  6. }  
int main()
{
    ::SetUnhandledExceptionFilter(MyUnhandledFilter);
    int *p;*p = 100;
    return 0;
}

5.调试dump文件

把dmp文件和exe, pdb文件放在同一目录下, 然后用编译器(如vc)打开, 然后开始调试就会中断到刚才中断的地方.

6. 使用windbg分析dmp文件定位程序bug

http://www.cppblog.com/woaidongmao/archive/2011/05/11/146206.html

7. VC6 Release下,产生 MiniDump的编译设置

http://www.cppblog.com/woaidongmao/archive/2011/05/10/146100.html

8.利用VS2005进行dump文件调试

http://www.cppblog.com/woaidongmao/archive/2009/10/21/99135.html


后记:csdn 发个博文真不容易,文字的排版让人纠结,期望越做越好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值