打開Dump文件調(diào)試
-
VS方式:
用VS打開dump
VS調(diào)試
a 根據(jù)截圖中“1”的位置確定程序安裝路徑谈飒,將同版本的程序安裝到同樣的目錄下
b 根據(jù)截圖中“2”的位置,設(shè)置符號(hào)文件的路徑(可將符號(hào)文件拷貝到安裝目錄下,確保符號(hào)文件與安裝包是同一版本)
c 點(diǎn)擊截圖中“3”的位置,進(jìn)行分析 windbg方式:
a 配置好symbol file path(即.pdb文件所在目錄)
b 用windbg打開dump文件
c 在符號(hào)文件正確的情況下,在windbg中輸入:!analyze -v
后就能查看到崩潰的代碼行秫筏。
查看模塊信息
有時(shí)我們拿到dump文件后,卻無(wú)法知道該dump編譯的版本挎挖,進(jìn)而無(wú)法知道該dump對(duì)應(yīng)的pdb文件这敬,這時(shí)可
以有兩個(gè)方式獲取模塊的版本信息:
- windbg中,使用命令
!lmi app.exe
或!lmi module.dll
[1]來(lái)得到模塊的相關(guān)信息肋乍,其中有一項(xiàng)就是模塊編譯時(shí)間鹅颊,如:
模塊編譯時(shí)間 - VS中,將dump文件拖到VS中墓造,
1 點(diǎn)擊“使用僅限本機(jī)進(jìn)行調(diào)試”
VS調(diào)試
2 加載完畢后堪伍,選中模塊
查看模塊
3 可查看各模塊的信息
模塊信息
強(qiáng)制加載
有時(shí)我們會(huì)遇到找不到dump文件對(duì)應(yīng)的pdb文件,但有相近的pdb的情況觅闽,這兩個(gè)版本之間代碼差異不大帝雇,在這種情況下,我們可以強(qiáng)制加載pdb來(lái)定位問(wèn)題: - 強(qiáng)制加載并分析
先輸入命令:.reload /i module.dll
[2]蛉拙,再輸入:!analyze -v
- 如果上述方式還不行尸闸,則可以增加“激活詳細(xì)符號(hào)加載”的步驟
先輸入命令:.reload /i module.dll
,再輸入:!sym noisy;.reload /i module.dll module!*test*
,最后輸入:!analyze -v
查看堆棧
查看堆棧主要用于以下兩種情況:
1 有時(shí)我們分析時(shí)吮廉,會(huì)遇到無(wú)任何堆棧信息情況苞尝,打印出類似如下
字段:APPLICATION_FAULT_WRONG_SYMBOLS_ZEROED_STACK_STACKIMMUNE
2 強(qiáng)制加載后,還是只能打印出模塊信息宦芦,而無(wú)詳細(xì)的堆棧信息宙址。
此時(shí)可以輸入命令:.ecxr
切換到異常線程,然后再輸入kp
调卑,kb
等命令打印出詳細(xì)的堆棧信息
查看當(dāng)前線程狀態(tài)
命令:~*kv
調(diào)試32位程序在64位機(jī)器下生成64位dump
命令:.load wow64exts
任務(wù)管理器創(chuàng)建dump
在64位系統(tǒng)下使用任務(wù)管理器生成dump時(shí)抡砂,默認(rèn)打開的任務(wù)管理器是64位的,創(chuàng)建dump也是64位的恬涧,這樣的dump不容易調(diào)試注益;其實(shí),系統(tǒng)還提供了一個(gè)32位的任務(wù)管理器:C:\Windows\SysWOW64\taskmgr.exe
溯捆,用它生成的dump是32位的丑搔,這樣就可以跟代碼生成的dump一樣去調(diào)試了。[3]
代碼行錯(cuò)亂
在我們?cè)诟鶕?jù)堆棧查找代碼行時(shí)现使,堆棧指出的位置要不就是崩潰的那一行低匙,要不就在崩潰的下一行,但有時(shí)碳锈,我們發(fā)現(xiàn)代碼行對(duì)應(yīng)不上任何可疑之處,一般有兩種情況:
- 本地代碼有過(guò)更新已經(jīng)不是崩潰時(shí)的代碼
- 強(qiáng)制加載的符號(hào)文件與崩潰版本的代碼差異欺抗,剛好是在崩潰文件處售碳。
解決方案:將代碼行有出入的文件revert到崩潰版本,崩潰版本的打包時(shí)間可以根據(jù)上面的“查看模塊信息”章節(jié)查看绞呈。
顯示最近的一條異常記錄
命令:.exr -1
贸人,由于異常是事件的一種,所以使用.exr -1命令得到的異常佃声,可能和使用.lastevent命令獲取的事件(其實(shí)是異常)艺智,是同一個(gè)。但二者顯示的信息各有側(cè)重點(diǎn)圾亏。
查看內(nèi)存
如果程序本身有內(nèi)存泄露十拣,在不斷的測(cè)試過(guò)程中,可能出現(xiàn)內(nèi)存不足的情況志鹃,打印出的堆棧信息可能是紊亂的夭问,此時(shí)可以考慮查看一下內(nèi)存,看是否還有可分配的內(nèi)存:!address -summary
曹铃,打印出的信息如下:
如上圖中缰趋,剩余內(nèi)存只有46M,明顯已經(jīng)內(nèi)存不足。
VS得出的堆棧比Windbg少
有時(shí)我們會(huì)交替的使用VS和Windbg來(lái)分析Dump秘血,如果發(fā)現(xiàn)用VS得出的堆棧信息比Windbg少味抖,可以把缺少的那個(gè)代碼文件拉到VS中,找到有顯示地址的函數(shù)的頭部灰粮。
將函數(shù)開頭的地址加上仔涩,Windbg中顯示的地址偏移,跳轉(zhuǎn)到崩潰處谋竖。
找到崩潰處:55D0E910+1e15=55D10725
红柱,在第一次call器联,即調(diào)用getDrawingMgr
時(shí)崩潰阻肩,調(diào)用地址為67酒朵,懷疑堆溢出犹撒,把該函數(shù)地址壓了焕梅。
【參考資料】
DUMP文件分析1:DUMP文件簡(jiǎn)介
Windbg調(diào)試命令詳解