記錄下自己使用WinDbg分析Dump時常用的一些方法和命令
1 !analyze -v //找出出錯的堆 2 .exrc //找到程序崩潰的位置 3 !heap //打印出錯函數的局部位置 4 !for_each_frame dv /t //顯示call stack內容 5 ~*kbn //顯示所有線程信息 6 ~線程號 s //切換線程 7 kbn //顯示當前線程信息 8 .reload //加載符號信息 9 !runaway 19 //查看19號線程所用時間 10 .load wow64exts 11 !sw //切換到64位
定位UnhandledExceptionFilter崩潰
1.~*kbn查看所有線程信息,找到崩潰的線程(搜索UnhandledExceptionFilter)
232 0f 167fd40c 77f37f1a 167fd43c 77ede304 00000000 kernel32!UnhandledExceptionFilter+0xf5 233 05 168ff904 77e3eeaa 168ff9c0 00000001 7e0be23d kernel32!UnhandledExceptionFilter+0x1f8 06 168ff990 77f37f1a 00000000 77ede304 00000000 kernel32!UnhandledExceptionFilter+0x172
2.切換到崩潰線程
~232 s
3.輸入dd 167fd43c(標志灰色背景的地址)
167fd43c 167fd53c 167fd55c 77f11288 00000001 167fd44c 00ca8fa4 167fd474 77f071b9 fffffffe 167fd45c 167fffc4 167fd55c 167fd510 167fe2d8 167fd46c 77f071cd 167fffc4 167fd524 77f0718b 167fd47c 167fd53c 167fffc4 167fd55c 167fd510 167fd48c 77ede0ed 00000000 167fd53c 167fffc4 167fd49c 77edf96f 167fd53c 167fffc4 167fd55c 167fd4ac 167fd510 77ede0ed 78b58518 167fd53c
4.輸入.cxr 167fd55c(第二個參數)查看上下文,然后輸入kb查看線程堆棧(輸入.exr 167fd53c查看錯誤信息)
通過以上步驟即可調出崩潰線程堆棧信息,如果想看的更清晰,可以在代碼中查看,按照如下步驟。
1.點擊Call Stack按鈕(或View->Call Stack)查看具體的堆棧信息
2.添加源碼(File->Source File Path),路徑之間用分號;分割
3.雙擊Call Stack中的堆棧信息,會自動定位好源代碼中的某一行
4.點擊Local按鈕可以查看當前堆棧本地變量
_except_handler函數(SEH異常處理函數)
085df400 7c9232a8 085df4ec 085dffdc 085df50c Kernel32!_except_handler3_0x61
輸入 .exr 085df4ec 獲取異常信息
輸入 .cxr 085df50c 獲取上下文信息
IndexOutOfRangeException堆越界問題查詢
1.找到gflags.exe,默認位置 C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
2.管理員運行cmd到gflags.exe位置,輸入
Gflag.exe /p /enable Test.exe
成功后會顯示
Warning: pageheap.exe is running inside WOW64. This scenario can be used to test x86 binaries (running inside WOW64) but not native (IA64) binaries. path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options vxofflinetrendquerytool.exe: page heap enabled
3.使用WinDbg掛載到進程,崩潰后再命令行界面上有提示信息。
調試死鎖問題
1.~*kvn/~*kb/~*kbn查看所有線程調用堆棧
2.找到WaitForSingleObject的那一行,記錄第三列的數字,為該線程正在等待的句柄(00000300)
7 Id: 1c38.1cc Suspend: 0 Teb: 7ffd4000 Unfrozen 00 061bfed8 77e2baf3 00000300 ffffffff 00000000 ntdll!KiFastSystemCallRet 01 061bfef0 77e2baa2 00000300 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0x43 02 061bff04 0286cd64 00000300 ffffffff 0438f62c kernel32!WaitForSingleObject+0x12
3.使用!handle命令查看句柄00000300是什么類型
!handle 300 f
看Object Specific Information下的Mutant Owner一列,具體案例參考https://blog.csdn.net/china_jeffery/article/details/78927524
調試運行中的進程
File->Attach to a Process File->Open Source File //打開源文件,F9可以設置斷點
注意:設置斷點之前需要先停掉進程,點擊
,點擊
/F5繼續運行程序(F10單句調試,F11單步跟蹤)
查看內存
查看普通變量的內存
一個正在運行的程序,若要查看其變量,可以在任務管理器中的進程詳細信息找到對應進程,右鍵創建轉儲文件(Dump文件)
輸入~*kbn查找出所有的進程,找到類似Test!main+0x10c字樣的一行,為程序的入口,一般為0號線程,點擊行號可以在Command窗口中輸入對應的信息(或使用命令.frame 0n11;dv /t /v)
一步一步點擊,找到你要看的對象的內存即可
查看靜態對象的內存
之后再記錄
其他
.reload -i命令無差別加載pdb,不匹配的pdb也會加載
lm顯示加載的pdb,帶有M字樣的為不匹配,點開不匹配的模塊可以看到模塊的真正時間
.reload 正常加載
lm成功匹配的模塊后邊會有路徑顯示
參考
https://blog.csdn.net/china_jeffery/article/details/78927524
http://www.cnblogs.com/gaochundong/p/windbg_cheat_sheet.html
