WinDbg分析dump文件

一 、Windbg介绍:

  Windbg是一款功能十分强大的调试工具,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、远程调试等等。

二、具体使用

 ● STEP 1:生成dump文件

#include "stdafx.h"
#include"windows.h"
#include <DbgHelp.h>
#include<iostream>
#include <direct.h>
#pragma comment(lib,"User32.lib")
#pragma comment(lib, "DbgHelp.Lib")

struct Object
{
    int id;
    char name[32];
};

LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
    LONG ret = EXCEPTION_EXECUTE_HANDLER;
    SYSTEMTIME st;
    CHAR szFileName[_MAX_PATH];
    WCHAR szFileName1[_MAX_PATH];
    ::GetLocalTime(&st);

    _getcwd(szFileName, _MAX_PATH);
    strcat(szFileName, "\\errorData.dmp");
    //将char *转为WCHAR *
    MultiByteToWideChar(CP_ACP, 0, szFileName, strlen(szFileName) + 1, szFileName1, sizeof(szFileName1) / sizeof(szFileName1[0]));
    //创建dmp文件
    HANDLE hFile = ::CreateFile(szFileName1, 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;
        // 往dmp文件中写出错时的信息
        BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
        ::CloseHandle(hFile);
    }
    else
    {
        std::cout << "创建文件失败!" << std::endl;
    }
    return ret;
}


int _tmain(int argc, _TCHAR* argv[])
{
    SetUnhandledExceptionFilter(&MyUnhandledFilter);

    Object* obj = NULL;
    obj->id = 1;

    system("pause");
    return 0;
}
View Code

    

 

 

 ● STEP 2:打开Windbg,设置参数

  (1)设置符号表路径  

    

 

 

     

 

   注意:C:\Users\zhao\Desktop\text1\Test2013\ConsoleApplication1\Debug,这个目录是当前程序编译时生成的.pdb文件路径。

     SRV*d:\symbols* http://msdl.microsoft.com/download/symbols,这个目录是系统需要的符号路径,没有的话去微软官网下载。

 (2)设置源代码路径

    

 

 

    

 

 

 (3)dmp文件导入

    

 

 

    

 

 

 ● STEP 3:命令分析dump文件

  (1)!analyze -v 分析dmp文件

    

 

 

* 这里需要注意的是:

  ①如果有pdb文件的话,尽可能的保证pdb文件和产生Dump文件的程序版本是匹配的。
  ②尽可能地保证所用来分析的源代码和程序版本是匹配的。
  如果上述有不匹配的情况,很有可能导致分析时所得到的结果不是正确的,或者是在通过地址偏移定位出现异常代码的行数时导致定位不准确。

  如果Dump文件是64位的,在分析时,需要根据被转储文件的位数来判断是否转为32位的,转换的命令如下:

.load wow64exts
!sw
这两个命令可以将64位的Dump转为32位的
再次输入!sw则可将转为32位的Dump再次转为64的

三、常用命令

  目前版本的Windbg共提供了20多条标准命令,140多条元命令和难以计数的大量扩展命令。

  在这里只介绍一下比较常用的命令,其他的可以参考《Windbg用法详解》或者网上搜索 

     !analyze –v  自动分析   kv  查看堆栈
     !runaway  显示所有线程的CPU消耗
     !handle e00 f 显示句柄详细详细
     !cs 00bcd034 临界对象
     !teb查看TEB的结构
     bp 下断点,还有条件断点
    !address 显示整个地址空间和使用摘要的信息
    dd 按字节查看

    dt 查看结构                                                       

 

posted @ 2022-02-08 17:10  zwj鹿港小镇  阅读(2883)  评论(0编辑  收藏  举报