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 查看結構                                                       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM