一 、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; }

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