双机调试和windbg的命令
各位大牛以及和我一樣還是菜鳥(niǎo)的朋友們,大家好,今天在調(diào)試驅(qū)動(dòng)程序時(shí),由于要做雙機(jī)調(diào)試,所以順便再論壇發(fā)給以后需要的朋友,相對(duì)網(wǎng)上其他教程我的這個(gè)
算是比較詳細(xì)了,因?yàn)槲沂强戳司W(wǎng)上很多相關(guān)文章,他們多多少少都還是存在一些問(wèn)題,可能導(dǎo)致我們無(wú)法正常調(diào)試。
我通過(guò)結(jié)合自己的實(shí)踐,做個(gè)教程叫大家,Windebug雙機(jī)調(diào)試是任何做驅(qū)動(dòng)的程序員都必須會(huì)的。。。。。。。。。。
廢話不多說(shuō),直接來(lái)教程:
(1)1.配置VMware(windows XP)? ?>>>>>為VMware工作站添加串口
添加完畢,然后在設(shè)置時(shí)把I/O模式勾了,如果添加完畢沒(méi)有出來(lái)如圖右邊的選項(xiàng)(虛擬機(jī)禁用了什么什么的)我們可以在編輯--->首選項(xiàng)---->設(shè)備
2.修改boot.ini文件完成配置
如果找不到就設(shè)置下查看文件加屬性顯示受保護(hù)的文件。
直接打開(kāi)C:\boot.ini(如果看不見(jiàn)的同學(xué)需要在文件夾選項(xiàng)中打開(kāi)顯示隱藏文件),然后在文件末尾另起一行添加如下啟動(dòng)參數(shù):
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /fastdetect /debugport=COM1 /baudrate=115200
3.配置宿主機(jī)windbg
在開(kāi)始里面找到我們安裝的Windebug圖標(biāo),創(chuàng)建桌面快捷方式,鼠標(biāo)右鍵,選擇屬性。
在目標(biāo)后面 空格添加 -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,pipe(記住打空格)。
5.下載調(diào)試所需符號(hào)
打開(kāi)windbg
現(xiàn)在已經(jīng)是完事具備,只欠符號(hào).接下來(lái)點(diǎn)擊 File – Symbol File Path…,填入 SRV*D:\symbol*http://msdl.microsoft.com/download/symbols?后,選中reload.單擊OK(如果是平時(shí)調(diào)試您自己的程序,或者存有本地 Symbol,這里也可填寫(xiě)本地符號(hào)文件路徑).
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#重要說(shuō)明
(1) windbg命令分為標(biāo)準(zhǔn)命令,元命令和擴(kuò)展命令。
? ? ?標(biāo)準(zhǔn)命令提供最基本的調(diào)試功能,不區(qū)分大小寫(xiě)。如:bp ?g ?dt ?dv ?k等
? ? ?元命令提供標(biāo)準(zhǔn)命令沒(méi)有提供的功能,也內(nèi)建在調(diào)試引擎中,以.開(kāi)頭。如.sympath ?.reload等
? ? ?擴(kuò)展命令用于擴(kuò)展某一方面的調(diào)試功能,實(shí)現(xiàn)在動(dòng)態(tài)加載的擴(kuò)展模塊中,以!開(kāi)頭。如!analyze等
(2) 進(jìn)入調(diào)試狀態(tài)時(shí),直接回車(chē)可重復(fù)執(zhí)行上一條命令;按上下方向鍵可以瀏覽和選擇以前輸入過(guò)的命令
(3) 神奇的Tab鍵,進(jìn)行命令補(bǔ)全;ESC清除當(dāng)前命令輸入框中的文本
(4) 使用;作為分隔符,可以在同一行輸入多條命令
(5) 上圖紅色框中的“0:000”。【0為當(dāng)前調(diào)試會(huì)話的進(jìn)程號(hào);000為調(diào)試會(huì)話的線程號(hào)】
(6) 當(dāng)命令提示符顯示*BUSY*時(shí),即使命令輸入框可以輸入命令,但輸入的命令不會(huì)立即被執(zhí)行,要等windbg空閑時(shí)才能執(zhí)行。
? ? ?可使用Ctrl + Break來(lái)終止一個(gè)長(zhǎng)時(shí)間未完成的命令
(7) 一次可以執(zhí)行多條命令,命令間用分號(hào);分隔 【如:bp main;bp `view.cpp:120`】,一次打2個(gè)斷點(diǎn)
(8) 為了保證windbg流暢運(yùn)行,在調(diào)試時(shí),盡量不要開(kāi)啟Watch、Locals、Registers、Call Stack、Processes and Threads窗口,直接用command來(lái)獲取信息
#啟動(dòng)調(diào)試
windbg -I ?// 將windbg設(shè)置成默認(rèn)調(diào)試器
windbg "notepad.exe" arguments??//?使用windbg啟動(dòng)調(diào)試notepad.exe
windbg -p 4200 // 將windbg附加到一個(gè)正在運(yùn)行的pid為4200的進(jìn)程上
windbg -pn?"notepad.exe"??//?將windbg附加到一個(gè)正在運(yùn)行的名為notepad.exe的進(jìn)程上
windbg?–z "c:\mydumpfile.dmp"?// 調(diào)試mydumpfile.dmp文件
.opendump?"c:\mydumpfile.dmp"??// 調(diào)試mydumpfile.dmp文件
.attach 0n4220??//?4220為十進(jìn)制pid,使用該命令附加調(diào)試時(shí),必須先存在一個(gè)調(diào)試會(huì)話
.detach???// 分離調(diào)試
.restart??// 重啟并調(diào)試
.kill??// 強(qiáng)制結(jié)束當(dāng)前調(diào)試
q??// 結(jié)束當(dāng)前調(diào)試會(huì)話,回到基礎(chǔ)工作空間,并結(jié)束調(diào)試進(jìn)程
qd??//?結(jié)束當(dāng)前調(diào)試會(huì)話,回到基礎(chǔ)工作空間,但不結(jié)束調(diào)試進(jìn)程
#獲取幫助
????//?打印出所有標(biāo)準(zhǔn)命令
.help??//?打印出所有元命令
.hh??// 打開(kāi)windbg的chm幫助文件
.hh bp??//?打開(kāi)windbg的chm幫助文件bp命令介紹頁(yè)
command /???// 打印命令command具體參數(shù)用法
#注釋符
*??//?注釋整行
$$?//?注釋(遇到分號(hào)結(jié)束)
#配置調(diào)試環(huán)境
注:如果被調(diào)試的模塊(無(wú)論移動(dòng)到本機(jī)的何處)是用本機(jī)代碼編譯產(chǎn)生的,都不需要進(jìn)行符號(hào)和源代碼的路徑設(shè)置
.sympath???//?查看當(dāng)前符號(hào)查找路徑
.sympath c:\symbols???//?將符號(hào)查找路徑設(shè)為:c:\symbols
.sympath+ c:\symbols??//?將c:\symbols添加到符號(hào)查找路徑集合中
.symfix?// 將符號(hào)查找路徑設(shè)為:SRV*WinDbg安裝目錄\Sym*http://msdl.microsoft.com/download/symbols
.symfix f:\symbols?//?將符號(hào)查找路徑設(shè)為:SRV*f:\symbols*http://msdl.microsoft.com/download/symbols
.symfix+ f:\symbols??//?將SRV*f:\symbols*http://msdl.microsoft.com/download/symbols添加到符號(hào)查找路徑集合中
.srcpath?//?查看當(dāng)前源文件查找路徑
.srcpath f:\src?//?將源文件查找路徑設(shè)為:f:\src ? 注:必須勾選上菜單“Debug”-“Source Mode”;另外pdb須與exe、dll等執(zhí)行模塊匹配上
.srcpath+ f:\src??//?將f:\src添加到源文件查找路徑集合中
.exepath?//?查看可執(zhí)行文件查找路徑
.exepath f:\bin?//?將可執(zhí)行文件查找路徑設(shè)為:f:\bin
.exepath+ f:\bin??//?將f:\bin添加到可執(zhí)行文件查找路徑集合中
#系統(tǒng)信息
vertarget?// os信息
!cpuid??// cpu信息
#wow64模式 ?【x64版windbg調(diào)試win32程序】
.effmach??// 查看當(dāng)前調(diào)試mode:x86、x64等
.load wow64exts??//?[!load wow64exts]?加載wow64exts.dll模塊 ?注:!sw就是wow64exts中的命令
.unload wow64exts??//?[!unload wow64exts]?卸載wow64exts.dll模塊
!sw??// [!wow64exts.sw] ?在多個(gè)mode:x86、x64上進(jìn)行循環(huán)切換 ?注:如果win32程序在x64的mode下,會(huì)看到地址是64位的
!k??//?[!wow64exts.k] ?打印32位、64位堆棧
!k 5?//?[!wow64exts.k 5] ?打印32位、64位堆棧,棧幀個(gè)數(shù)為5
!info?//?[!wow64exts.info] ?輸出wow64相關(guān)的PEB、TEB和TLS基本信息
!r?//?[!wow64exts.r] ?輸出處理器當(dāng)前上下文信息
!r dumpTest!main??//?[!wow64exts.r dumpTest!main] ?輸出main函數(shù)地址的上下文信息
#符號(hào)加載與查看
除了使用ld和.reload命令直接加載符號(hào)文件,某些使用符號(hào)的命令也可以觸發(fā)調(diào)試器來(lái)加載符號(hào),如:?;厮菝?k*)和反匯編命令(u)等。
值得說(shuō)明的是,windbg缺省使用的是懶惰式符號(hào)加載策略,當(dāng)它收到模塊加載事件時(shí),它通常是不會(huì)加載符號(hào)的,符號(hào)狀態(tài)顯示為deferred(延遲加載)。
.symopt?//?顯示當(dāng)前所有符號(hào)選項(xiàng)
.symopt+ flags?//?添加符號(hào)選項(xiàng)
.symopt- flags?//?刪除符號(hào)選項(xiàng)
!sym noisy???// 激活詳細(xì)符號(hào)加載(noisy symbol loading)顯示
!sym quiet???// 禁止詳細(xì)符號(hào)加載顯示
ld *?//?為所有模塊加載符號(hào)
ld?kernel32?// 加載kernel32.dll的符號(hào)
.reload?//?為所有已加載模塊載入符號(hào)信息
.reload /i?// 重新加載不匹配符號(hào)的模塊【dmp文件沒(méi)有對(duì)應(yīng)的pdb時(shí)使用】
.reload /i TGame.exe?// 重新加載不匹配符號(hào)的TGame.exe
.reload /f /v?//?f:強(qiáng)制立即模式(不允許延遲載入) ?v:詳細(xì)模式
.reload /f?@"c:\windows\System32\verifier.dll"?//?為指定模塊加載符號(hào)信息
.reload /f TGame.exe?//?為T(mén)Game.exe加載符號(hào)信息
.reload /u TGame.exe?// 卸載TGame.exe及其載符號(hào)信息
.chain??// 顯示已經(jīng)加載進(jìn)來(lái)的模塊
x *!?//?列出所有模塊對(duì)應(yīng)的符號(hào)信息
lm?//?列出所有模塊(加載和未加載)對(duì)應(yīng)的符號(hào)信息
lmv?//?列出所有模塊(加載和未加載)對(duì)應(yīng)的符號(hào)信息
lmvm ntdll??// 查看ntdll.dll的詳細(xì)信息(注意exe、dll等都不要帶后綴名)
x ConsoleTest!*?//?列出ConsoleTest模塊中的所有符號(hào)
x ConsoleTest!add*?//?列出ConsoleTest模塊中的所有add開(kāi)頭的符號(hào)
x /t /v ConsoleTest!*?//?帶數(shù)據(jù)類型、符號(hào)類型和大小信息,列出ConsoleTest模塊中的所有符號(hào)
x kernel32!*LoadLib*?//?列出kernel32模塊中所有含LoadLib字樣的符號(hào)
#進(jìn)程
|???//?列出調(diào)試進(jìn)程
|*??//?列出調(diào)試進(jìn)程
|N??//?參看序數(shù)為N的調(diào)試進(jìn)程
|Ns?//?切換序數(shù)為N的進(jìn)程為當(dāng)前調(diào)試進(jìn)程
#線程
~???//?列出線程
~*??//?所有線程
~* k?//?所有線程堆棧信息
~* r?//?所有線程寄存器信息
~.??//?查看當(dāng)前線程
~0s?// 查看主線程
~#?//?查看導(dǎo)致當(dāng)前事件或異常的線程
~N??//?查看序數(shù)為N的線程
~~[n]??//?查看線程ID為n的線程
~Ns???//?切換序數(shù)為N的線程為當(dāng)前調(diào)試線程
~N f??//?凍結(jié)序數(shù)為N的線程
~N u?//?解凍序數(shù)為N的線程
~N n??//?Suspend序數(shù)為N的線程
~N m?//?Resume序數(shù)為N的線程
~* e !gle?// 顯示所有線程最后的一個(gè)錯(cuò)誤信息 ?e后可以為任意windbg命令
.ttime??// 查看當(dāng)前線程時(shí)間信息
!runaway??//顯示當(dāng)前進(jìn)程的所有線程時(shí)間信息
?
#斷點(diǎn)
bl???//?列出所有斷點(diǎn)
bc *?//?清除所有斷點(diǎn)
bc 1?//?清除1號(hào)斷點(diǎn)
bc 1 2 5??//?清除1號(hào)、2號(hào)、5號(hào)斷點(diǎn)
be *??//?啟用所有斷點(diǎn)
be 1??//?啟用1號(hào)斷點(diǎn)
be 1 2 5?//?啟用1號(hào)、2號(hào)、5號(hào)斷點(diǎn)
bd *??//?禁用所有斷點(diǎn)
bd 1??//?禁用1號(hào)斷點(diǎn)
bd 1 2 5?//?禁用1號(hào)、2號(hào)、5號(hào)斷點(diǎn)
bp 7c801b00??//?在7c801b00地址處放置一個(gè)斷點(diǎn)
bp `ConsoleTest.cpp:36`??//?在ConsoleTest.cpp的36行處放置一個(gè)斷點(diǎn)
bp main?//?在main函數(shù)的起始處放置一個(gè)斷點(diǎn)
bp CSecondLoader::CSecondLoader??//?在CSecondLoader的構(gòu)造函數(shù)處放置一個(gè)斷點(diǎn)
bp TestCommon! CTest::add??// 在TestCommon.dll的Test.cpp文件的CTest::add()函數(shù)起始處放置一個(gè)斷點(diǎn)
bp?`ConsoleTest.cpp:40`?".if (poi(pVar)>5) {};?{g}"?//?".if (Condition) {Optional Commands}; {g}" ? ?條件斷點(diǎn) pVar指針指向的值>5,執(zhí)行空語(yǔ)句(;),斷住 ?否則繼續(xù)執(zhí)行
bp?`ConsoleTest.cpp:40`?"j (poi(pVar)>5) ' ';?'g'"?// "j (Condition) 'Optional Commands'; 'g'" ? ?j為條件表示式:條件斷點(diǎn) pVar指針指向的值>5,執(zhí)行空語(yǔ)句(;),斷住 ?否則繼續(xù)執(zhí)行
注:Condition表達(dá)式語(yǔ)法默認(rèn)的是MASM表達(dá)式語(yǔ)法。使用復(fù)雜C++表達(dá)式時(shí)我們需要用@@c++()將表達(dá)式包圍住;如:"j @@c++(*pVar>5) ' '; 'g'"
---------------------------------
x表示的一個(gè)地址
hi(x) 高16 bits
low(x) 低16 bits
by(x) 返回第一個(gè)byte
wo(x) 返回第一個(gè)word
dwo(x) 返回第一個(gè)dword
qwo(x) 返回第一個(gè)4 word(Quad-word)
poi(x) 返回第一個(gè)指針?biāo)赶虻闹?/span>
---------------------------------
bp?`ConsoleTest.cpp:40`?"j @eax = 0xa3 ''; 'g'"?// j為條件表示式:條件斷點(diǎn) 寄存器eax的值為0xa3時(shí)斷住
bp kernel32!CreateFileA??// 在系統(tǒng)API的CreateFileA函數(shù)處放置一個(gè)斷點(diǎn)
bp kernel32!CreateFileA ".echo;.printf\"CreateFileA(%ma,%p,%p), ret=\",poi(esp+4),dwo(esp+8),dwo(esp+c);gu;.printf\"%N\",eax;.echo;g"// 不斷住進(jìn)程情況下,打印所有的CreateFileA調(diào)用
bp advapi32!RegOpenKeyExA ".echo;.printf\"RegOpenKeyExW(%p,\\\"%ma\\\",%N,%N,%p) returned: \", dwo(esp+4), poi(esp+8), dwo(esp+c), dwo(esp+10), dwo(esp+14);gu;.printf\"%N\",eax;.echo;g"??// 不斷住進(jìn)程情況下,打印所有的RegOpenKeyExA調(diào)用(打開(kāi)注冊(cè)表鍵值)
bu??//?保存斷點(diǎn),其用法和bp一樣
bm add_*??//?匹配add_開(kāi)頭的函數(shù),并在這些函數(shù)起始處都打上斷點(diǎn)
ba w4 0x0483dfe0?//?當(dāng)對(duì)0483dfe0地址寫(xiě)操作時(shí)停下,前面要帶上0x,否則會(huì)報(bào)錯(cuò)
? ? ? ? ? ? ? ? ? ? ? ? ??//?ba [r|w|e] [Size] Addr ? ???[r=read/write, w=write, e=execute], Size=[1|2|4 bytes]
#調(diào)試執(zhí)行控制
g??//?Go(F5)
gH?//?執(zhí)行g(shù)H命令強(qiáng)制讓調(diào)試器返回已經(jīng)處理了這個(gè)異常。【Go with Exception Handled】
? ? ?// 系統(tǒng)收到這個(gè)回復(fù)后會(huì)停止分發(fā)異常(因?yàn)檎{(diào)試器聲稱已經(jīng)處理了異常),恢復(fù)調(diào)試目標(biāo)繼續(xù)執(zhí)行,
? ? ?// ?但由于異常條件仍在,所以還會(huì)產(chǎn)生異常,于是再次分發(fā),WinDBG再次中斷到命令模式。
gN?//?【Go with Exception Not Handled】
? ? ?// 執(zhí)行g(shù)N命令強(qiáng)制讓調(diào)試器返回沒(méi)有處理了這個(gè)異常,那么系統(tǒng)會(huì)進(jìn)一步分發(fā)該異常,
? ? ?// 如果沒(méi)有其他調(diào)試器也不處理,最后系統(tǒng)會(huì)彈出程序終止對(duì)話框。
gu??//?執(zhí)行到當(dāng)前函數(shù)完成時(shí)停下?【Go Up】
Ctrl+Break ?// 暫停正在運(yùn)行的程序
p ???//?單步執(zhí)行(F10) ?【Step】
p 2?//?2為步進(jìn)數(shù)目
pc???//?執(zhí)行到下一個(gè)函數(shù)調(diào)用處停下?【Step to ?Next Call】
pa 7c801b0b?//?執(zhí)行到7c801b0b地址處停下 ?【Step to Adress】
t?? ??//?Step into(F11) 【Trace】
tc?? ?//?執(zhí)行到下一個(gè)進(jìn)入點(diǎn)處停下 【Trace to Next Call】
ta 7c801b12??//?執(zhí)行到7c801b12地址處停下 【Trace to Adress】
# 查看句柄
!handle??// 查看所有句柄的ID
!handle 000007f8?1??// 查看ID為000007f8的句柄的類型
!handle 000007f8?4??//?查看ID為000007f8的句柄的名稱
!handle 0 5??//?查看所有句柄的類型和名稱
?
# 查看變量
=== ?0n(十進(jìn)制) ?0x(十六進(jìn)制) ?0t(8進(jìn)制) ?0y(2進(jìn)制) ? ?可以使用n?[8|10|16]命令來(lái)修改數(shù)值進(jìn)制表示方式(輸入n可查看當(dāng)前進(jìn)制,默認(rèn)為16進(jìn)制)===
-- VC6.0的Link選項(xiàng)需要將/pdbtype:sept改為/pdbtype:con, 否則生成的pdb文件中將不包含如自定義結(jié)構(gòu)體,類等信息
dt nRet??//?查看局部變量nRet的類型與值(函數(shù)參數(shù)變量請(qǐng)用dv命令)
dt myApp!g_app?// 表示顯示myApp進(jìn)程里全局變量g_app的內(nèi)存布局(注:vc6見(jiàn)上述說(shuō)明)
dt WindbgTest!CTest?// 查看模塊WindbgTest的CTest的內(nèi)存布局(注:vc6見(jiàn)上述說(shuō)明)
dt WindbgTest!CTest 0x0041f8d4??// 將0x0041f8d4地址處內(nèi)容按照模塊WindbgTest的CTest的內(nèi)存布局來(lái)解析(注:vc6見(jiàn)上述說(shuō)明)
Windbg默認(rèn)會(huì)用寄存器ECX里面的值作為this指針地址,其實(shí)這樣是有時(shí)候是錯(cuò)誤的。
有些C++編譯器在做代碼優(yōu)化之后會(huì)把 this指針?lè)旁谄渌拇嫫骼锩?#xff0c;比如ESI。?
所以在調(diào)試的時(shí)候還需要讀一下匯編代碼來(lái)確定this 在哪個(gè)寄存器里面。
比如我們看到 MOV EAX, dword ptr [ESI + 0x48h](獲取當(dāng)前對(duì)象內(nèi)存偏移為0x48h處的4字節(jié)成員變量),就可以判斷ESI 是this 指針。
這時(shí)可以通過(guò)如下命令打印this的內(nèi)存結(jié)構(gòu):dt -b 模塊名!類名 @esi
dt this?//?查看this指針的類型及成員變量(注:vc6見(jiàn)上述說(shuō)明)
dt -b this??// 查看this指針的類型及成員變量,如果某一成員變量為結(jié)構(gòu)體,則把其結(jié)構(gòu)成員也一一打印出來(lái)
dt _PEB @$PEB?// 查看PEB(process's environment block)內(nèi)存結(jié)構(gòu)
?? this->m_nPen??// 查看成員變量的值(注:vc6見(jiàn)上述說(shuō)明)
?? this?// 查看this指針中的成員變量(注:vc6見(jiàn)上述說(shuō)明)
? nCount?// 顯示局部變量nCount的地址(前面4198608為10進(jìn)制表示地址,004010d0為16進(jìn)制表示地址) 形如:Evaluate expression: 4198608 = 004010d0
? HeapTest!CTest::Add ?// 顯示HeapTest模塊中CTest類中的Add函數(shù)地址
dv???//?顯示當(dāng)前函數(shù)內(nèi)所有局部變量,函數(shù)參數(shù)的值
dv n*??//?顯示當(dāng)前函數(shù)內(nèi)n開(kāi)頭的所有局部變量,函數(shù)參數(shù)的值
dv nCount?//?查看局部變量nCount的值
dv a?//?查看函數(shù)參數(shù)變量a的值
dv /t /i /V /a|/n|/z
/*****************************************?
更加詳細(xì)地顯示當(dāng)前函數(shù)內(nèi)所有局部變量,函數(shù)參數(shù)信息
i = type (local, global, parameter)
t = data type
V = memory address or register location
-----------------------
a = sort by Addr, n = sort by name, z = sort by size
*****************************************/
x??// 用法和dv命令一致,顯示當(dāng)前函數(shù)內(nèi)所有局部變量,函數(shù)參數(shù)的地址與值
#調(diào)用堆棧
k??//?顯示當(dāng)前調(diào)用堆棧
kn?//?帶棧編號(hào)顯示當(dāng)前調(diào)用堆棧
kb??//?打印出前3個(gè)函數(shù)參數(shù)的當(dāng)前調(diào)用堆棧
02a9ffec 00000000 01e511f9 0174c570 00000000 kernel32!BaseThreadStart+0x37
----------------------------------------------
kernel32!BaseThreadStart+0x37 當(dāng)前函數(shù)kernel32!BaseThreadStart執(zhí)行的指令地址。
01e511f9 0174c570 00000000 ?參數(shù)相關(guān)的數(shù)值【從左到右 -- 參數(shù)1 ?參數(shù)2:offset為sizeof(參數(shù)1) ?參數(shù)3:offset為sizeof(參數(shù)1)+sizeof(參數(shù)2) ?...】。注:如果是成員函數(shù),this指針通過(guò)ecx或其他寄存器來(lái)傳遞
02a9ffec 00000000是 ebp 和 上層函數(shù)返回地址。
======================================================
Windows 7 Ultimate Service Pack 1 [Build 6.1.7601]
CPU: Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
《Game》 20.15.1112 6EF76A43E6B1DD58907F3E066506E918
----------------------------------------
Type: EXCEPTION_ACCESS_VIOLATION//非法地址訪問(wèn)異常
Error: Read address 0x00074685//讀取0x00074685地址出錯(cuò)(該地址對(duì)應(yīng)的內(nèi)存頁(yè),進(jìn)程無(wú)讀取權(quán)限)
Address: 64DCAF68//崩潰發(fā)生的指令地址
CallStack:
//0x64D90000為模塊MSVCR90.dll的基地址,3AF68為崩潰指令在模塊中的偏移值,(0492B5D0,00074685,0000000C,00462482)為參數(shù)信息
0x64D90000[3AF68] MSVCR90.dll: (0492B5D0,00074685,0000000C,00462482)
0X00400000[11158A] tgame.exe: (0492B5D0,00074685,00000000,00000000)
kb 5?//?只顯示最上的5層調(diào)用堆棧
kv?? // 在kb的基礎(chǔ)上增加了函數(shù)調(diào)用約定等信息
kp??//?顯示每一層函數(shù)調(diào)用的完整參數(shù),包括參數(shù)類型、名字、取值(必須是完整符號(hào)的情況下,private symbols);注意:若程序被優(yōu)化,這些值不一定對(duì)
kd??// 打印堆棧的地址
.frame?//?顯示當(dāng)前棧幀
.frame n?//?設(shè)置編號(hào)n的棧幀為當(dāng)前棧幀(n為16進(jìn)制數(shù))
.frame /r n?//?設(shè)置編號(hào)n的棧幀為當(dāng)前棧幀(n為16進(jìn)制數(shù)) 并顯示寄存器變量
!uniqstack?//?顯示所有線程的調(diào)用堆棧
#查看匯編
u .??// 反匯編當(dāng)前ip寄存器地址的后8條指令
u $ip??// 反匯編當(dāng)前ip寄存器地址的后8條指令
ub .??// 反匯編當(dāng)前ip寄存器地址的前8條指令
ub $ip??// 反匯編當(dāng)前ip寄存器地址的前8條指令
u main+0x29 L30?// 反匯編main+0x29地址的后30條指令
u??// 反編譯下8條指令
uf CTest::add??// 反匯編CTest類的add函數(shù)
uf /c main??// 反匯編main函數(shù),通過(guò)/c可以查看main函數(shù)中的函數(shù)調(diào)用(call)都有哪些
ub?000c135d?L20??// 查看地址為000c135d指令前的20條指令內(nèi)容
?
#寄存器
r?//?顯示所有寄存器信息及發(fā)生core所在的指令
r eax, edx?//?顯示eax,edx寄存器信息
r eax=5, edx=6??//?對(duì)寄存器eax賦值為5,edx賦值為6
#內(nèi)存
!address 7ffd8000 ?// 查看7ffd8000地址處內(nèi)存頁(yè)屬性
dd /c 5 7c801e02??// 從7c801e02內(nèi)存處開(kāi)始以dword為單位顯示內(nèi)存(寬度為:5)【默認(rèn)顯示128字節(jié)長(zhǎng)度的內(nèi)容】
dd /c 5 7c801e02 L8??// 從7c801e02內(nèi)存處開(kāi)始以dword為單位顯示內(nèi)存(寬度為:5)【顯示8個(gè)dword】
da /c 100 7c80ff03??// 從7c80ff03內(nèi)存處開(kāi)始顯示Ascii字符串(寬度為:100)
du /c 100 7c8022f5? // 從7c8022f5內(nèi)存處開(kāi)始顯示Unicode字符串(寬度為:100)
/*****************************************
d[a| u| b| w| W| d| c| q| f| D] [/c 列數(shù)] [地址]
a = ascii chars
u = Unicode chars
b = byte + ascii
w = word (2b)
W = word (2b) + ascii
d = dword (4b)
c = dword (4b) + ascii
q = qword (8b)
f = floating point (single precision - 4b)
D = floating point (double precision - 8b)
*****************************************/
dyb /c 3?7c801e02??//?從7c801e02內(nèi)存處開(kāi)始,顯示byte及二進(jìn)制(寬度為:3)
/*****************************************
dy[b | d] .. ? //?b = binary+byte ? ??d = binary+dword
*****************************************/
s -w 522e0000 L0x100 ?0x1212 0x2212 0x1234?// 表示在起始地址522e0000之后的0x100個(gè)單位內(nèi)搜索0x1212 0x2212 0x1234系列的起始地址
s -u 522e0000 527d1000 "web"??//表示在522e0000?和527d1000之間搜索Unicode?字符串”web”
ea 0x445634 "abc"??// 表示在0x445634地址寫(xiě)入Ascii字符串a(chǎn)bc,?不包含結(jié)束符0
eza 0x445634 "abc"??// 表示在0x445634地址寫(xiě)入Ascii字符串a(chǎn)bc, 包含結(jié)束符0
eu 0x445634 "abc"??// 表示在0x445634地址寫(xiě)入U(xiǎn)nicode字符串a(chǎn)bc,?不包含結(jié)束符0
ezu 0x445634 "abc"??// 表示在0x445634地址寫(xiě)入U(xiǎn)nicode字符串a(chǎn)bc, 包含結(jié)束符0
ed nCounter 80??// 將變量nCounter的值修改為80(注:80為10進(jìn)制還是16進(jìn)制,還是其他,取決于當(dāng)前進(jìn)制)
#查看堆(Heap)
!heap -s??// 顯示進(jìn)程堆的個(gè)數(shù)(每一項(xiàng)是一個(gè)堆,也就是_HEAP結(jié)構(gòu)指針,對(duì)應(yīng)的API是HeapCreate)
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast?
(k) (k) (k) (k) length blocks cont. heap?
-----------------------------------------------------------------------------
00140000 50000062 1024 12 12 1 1 1 0 0 L?
00240000 50001062 64 24 24 15 1 1 0 0 L?
00250000 50008060 64 12 12 10 1 1 0 0?
00380000 50001063 64 12 12 4 2 1 0 bad?
-----------------------------------------------------------------------------
dt _HEAP 00140000??// 選取一個(gè)堆的地址,打印該堆的內(nèi)存結(jié)構(gòu)
ntdll!_HEAP
+0x000 Entry : _HEAP_ENTRY
+0x008 Signature : 0xeeffeeff
+0x00c Flags : 0x50000062
+0x010 ForceFlags : 0x40000060
+0x014 VirtualMemoryThreshold : 0xfe00
+0x018 SegmentReserve : 0x100000
+0x01c SegmentCommit : 0x2000
+0x020 DeCommitFreeBlockThreshold : 0x200
+0x024 DeCommitTotalFreeThreshold : 0x2000
+0x028 TotalFreeSize : 0xaf
+0x02c MaximumAllocationSize : 0x7ffdefff
+0x030 ProcessHeapsListIndex : 1
+0x032 HeaderValidateLength : 0x608
+0x034 HeaderValidateCopy : (null)?
+0x038 NextAvailableTagIndex : 0
+0x03a MaximumTagIndex : 0
+0x03c TagEntries : (null)?
+0x040 UCRSegments : (null)?
+0x044 UnusedUnCommittedRanges : 0x00140598 _HEAP_UNCOMMMTTED_RANGE
+0x048 AlignRound : 0x17
+0x04c AlignMask : 0xfffffff8
+0x050 VirtualAllocdBlocks : _LIST_ENTRY [ 0x140050 - 0x140050 ]
+0x058 Segments : [64] 0x00140640 _HEAP_SEGMENT
+0x158 u : __unnamed
+0x168 u2 : __unnamed
+0x16a AllocatorBackTraceIndex : 0
+0x16c NonDedicatedListLength : 1
+0x170 LargeBlocksIndex : (null)?
+0x174 PseudoTagEntries : (null)?
+0x178 FreeLists : [128] _LIST_ENTRY [ 0x142a90 - 0x142a90 ]
+0x578 LockVariable : 0x00140608 _HEAP_LOCK
+0x57c CommitRoutine : (null)?
+0x580 FrontEndHeap : 0x00140688 Void
+0x584 FrontHeapLockCount : 0
+0x586 FrontEndHeapType : 0x1 ''
+0x587 LastSegmentIndex : 0 ''
!heap -a 00140000?// 選取一個(gè)堆的地址,打印該堆的信息,比上面打印內(nèi)存命令更詳細(xì)直觀
Index Address Name Debugging options enabled
1: 00140000?
Segment at 00140000 to 00240000 (00003000 bytes committed)
Flags: 50000062
ForceFlags: 40000060
Granularity: 8 bytes
Segment Reserve: 00100000
Segment Commit: 00002000
DeCommit Block Thres: 00000200
DeCommit Total Thres: 00002000
Total Free Size: 000000af
Max. Allocation Size: 7ffdefff
Lock Variable at: 00140608
Next TagIndex: 0000
Maximum TagIndex: 0000
Tag Entries: 00000000
PsuedoTag Entries: 00000000
Virtual Alloc List: 00140050
UCR FreeList: 00140598
FreeList Usage: 00000000 00000000 00000000 00000000
FreeList[ 00 ] at 00140178: 00142a90 . 00142a90?
00142a88: 00050 . 00578 [14] - free
Segment00 at 00140640:
Flags: 00000000
Base: 00140000
First Entry: 00140680
Last Entry: 00240000
Total Pages: 00000100
Total UnCommit: 000000fd
Largest UnCommit:000fd000
UnCommitted Ranges: (1)
00143000: 000fd000
Heap entries for Segment00 in Heap 00140000
00140000: 00000 . 00640 [01] - busy (640)
00140640: 00640 . 00040 [01] - busy (40)
00140680: 00040 . 01818 [07] - busy (1800), tail fill - unable to read heap entry extra at 00141e90
00141e98: 01818 . 00040 [07] - busy (22), tail fill - unable to read heap entry extra at 00141ed0
00141ed8: 00040 . 00050 [07] - busy (36), tail fill - unable to read heap entry extra at 00141f20
00141f28: 00050 . 002f0 [07] - busy (2d8), tail fill - unable to read heap entry extra at 00142210
00142218: 002f0 . 00330 [07] - busy (314), tail fill - unable to read heap entry extra at 00142540
00142548: 00330 . 00330 [07] - busy (314), tail fill - unable to read heap entry extra at 00142870
00142878: 00330 . 00040 [07] - busy (24), tail fill - unable to read heap entry extra at 001428b0
001428b8: 00040 . 00028 [07] - busy (10), tail fill - unable to read heap entry extra at 001428d8
001428e0: 00028 . 00058 [07] - busy (40), tail fill - unable to read heap entry extra at 00142930
00142938: 00058 . 00058 [07] - busy (40), tail fill - unable to read heap entry extra at 00142988
00142990: 00058 . 00060 [07] - busy (44), tail fill - unable to read heap entry extra at 001429e8
001429f0: 00060 . 00020 [07] - busy (1), tail fill - unable to read heap entry extra at 00142a08
00142a10: 00020 . 00028 [07] - busy (10), tail fill - unable to read heap entry extra at 00142a30
00142a38: 00028 . 00050 [07] - busy (36), tail fill - unable to read heap entry extra at 00142a80
00142a88: 00050 . 00578 [14] free fill
00143000: 000fd000 - uncommitted bytes.
#虛擬內(nèi)存
!vadump??// 查看虛擬內(nèi)存布局?
#設(shè)置事件發(fā)生時(shí)windbg行為
sx?//?顯示windbg遇到每個(gè)異常和事件時(shí)的行為
sxr?//?將所有異常和事件過(guò)濾器的狀態(tài)重設(shè)為默認(rèn)值
sxe ?ld?//?當(dāng)加載模塊時(shí),立即中斷(Break)到調(diào)試器中(第一次處理機(jī)會(huì))
sxe ud?// 當(dāng)卸載模塊時(shí),windbg不會(huì)在第一次處理機(jī)會(huì)時(shí)中斷(雖然會(huì)顯示信息)。如果其他錯(cuò)誤處理器沒(méi)有處理掉該異常,執(zhí)行會(huì)停止下來(lái)并中斷(Break)到windbg中(第二次處理機(jī)會(huì))
sxn et?// 當(dāng)線程退出時(shí),windbg會(huì)打印出一條消息
sxi ct?// 當(dāng)線程創(chuàng)建時(shí),windbg不中斷也不打印消息
#dump輸出
?.dump?/ma "d:\mydmpfile.dmp"?// 將當(dāng)前調(diào)試進(jìn)程輸出Dump文件
#其他元命令
.tlist??//?顯示所有進(jìn)程
.cls??//?清除屏幕
.logopen c:\1.log?? // 將command內(nèi)容輸出到c:\1.log文件中
#其他擴(kuò)展命令
!analyze -v??//?詳細(xì)顯示當(dāng)前異常信息
!peb?//?格式化輸出PEB信息(process's environment block)
?
PEB at 7efde000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: No
ImageBaseAddress: 00f20000
Ldr 76fa0200
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList: 003a4d78 . 003e4a00
Ldr.InLoadOrderModuleList: 003a4ce8 . 003e49f0
Ldr.InMemoryOrderModuleList: 003a4cf0 . 003e49f8
Base TimeStamp Module
f20000 54772f74 Nov 27 22:04:36 2014 C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe
76ea0000 5684255b Dec 31 02:41:31 2015 C:\windows\SysWOW64\ntdll.dll
74790000 568425ff Dec 31 02:44:15 2015 C:\windows\syswow64\kernel32.dll
75b00000 56842600 Dec 31 02:44:16 2015 C:\windows\syswow64\KERNELBASE.dll
... ...
71d40000 55a5cad6 Jul 15 10:52:06 2015 C:\windows\System32\msxml6.dll
71d20000 4a5bdb38 Jul 14 09:11:20 2009 C:\windows\System32\bcrypt.dll
71ce0000 5600ce51 Sep 22 11:43:13 2015 C:\windows\SysWOW64\bcryptprimitives.dll
SubSystemData: 00000000
ProcessHeap: 003a0000
ProcessParameters: 003a2188
CurrentDirectory: 'C:\windows\system32\'
WindowTitle: '"C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe"'
ImageFile: 'C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe'
CommandLine: '"C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe" -Embedding'
DllPath: 'C:\Program Files (x86)\Citrix\ICA Client;C:\windows\system32;C:\windows\system;C:\windows;
Environment: 003a07f0
=::=::\
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\kekec\AppData\Roaming
CommonProgramFiles=C:\Program Files (x86)\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=KEKEC-PC1
ComSpec=C:\windows\system32\cmd.exe
DXSDK_DIR=D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\kekec
include=D:\Program Files (x86)\Microsoft Visual Studio\VC98\atl\include;D:\Program Files (x86)\Microsoft Visual Studio\VC98\mfc\include;
lib=D:\Program Files (x86)\Microsoft Visual Studio\VC98\mfc\lib;D:\Program Files (x86)\Microsoft Visual Studio\VC98\lib
LOCALAPPDATA=C:\Users\kekec\AppData\Local
LOGONSERVER=\\GM-HEIJI
MSDevDir=D:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98
NUMBER_OF_PROCESSORS=8
OS=Windows_NT
Path=C:\ProgramData\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 60 Stepping 3, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3c03
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files (x86)
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PSModulePath=C:\windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\windows
TEMP=C:\Users\kekec\AppData\Local\Temp
TMP=C:\Users\kekec\AppData\Local\Temp
USERDNSDOMAIN=TENCENT.COM
USERDOMAIN=TENCENT
USERNAME=kekec
USERPROFILE=C:\Users\kekec
VS120COMNTOOLS=D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
VS80COMNTOOLS=D:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\
VS90COMNTOOLS=d:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
windir=C:\windows
?
!gle ?// 打印當(dāng)前線程最近的錯(cuò)誤信息LastError
!gle -all ?// 打印所有線程的最近的錯(cuò)誤信息
!error ?897// 顯示錯(cuò)誤碼為897的詳細(xì)描述信息
總結(jié)
以上是生活随笔為你收集整理的双机调试和windbg的命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: eclipse将java工程转换为jav
- 下一篇: windbg 符号表