各位大牛以及和我一樣還是菜鳥的朋友們,大家好,今天在調(diào)試驅(qū)動(dòng)程序時(shí),由于要做雙機(jī)調(diào)試,所以順便再論壇發(fā)給以后需要的朋友,相對(duì)網(wǎng)上其他教程我的這個(gè)
添加完畢,然后在設(shè)置時(shí)把I/O模式勾了,如果添加完畢沒有出來如圖右邊的選項(xiàng)(虛擬機(jī)禁用了什么什么的)我們可以在編輯--->首選項(xiàng)---->設(shè)備
2.修改boot.ini文件完成配置
如果找不到就設(shè)置下查看文件加屬性顯示受保護(hù)的文件。 直接打開C:\boot.ini(如果看不見的同學(xué)需要在文件夾選項(xiàng)中打開顯示隱藏文件),然后在文件末尾另起一行添加如下啟動(dòng)參數(shù): 3.配置宿主機(jī)windbg 在目標(biāo)后面 空格添加 -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,pipe(記住打空格)。 5.下載調(diào)試所需符號(hào) 打開windbg +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #重要說明 (1) windbg命令分為標(biāo)準(zhǔn)命令,元命令和擴(kuò)展命令。 標(biāo)準(zhǔn)命令提供最基本的調(diào)試功能,不區(qū)分大小寫。如:bp g dt dv k等 元命令提供標(biāo)準(zhǔn)命令沒有提供的功能,也內(nèi)建在調(diào)試引擎中,以.開頭。如.sympath .reload等 擴(kuò)展命令用于擴(kuò)展某一方面的調(diào)試功能,實(shí)現(xiàn)在動(dòng)態(tài)加載的擴(kuò)展模塊中,以!開頭。如!analyze等 (2) 進(jìn)入調(diào)試狀態(tài)時(shí),直接回車可重復(fù)執(zhí)行上一條命令;按上下方向鍵可以瀏覽和選擇以前輸入過的命令 (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來終止一個(gè)長時(shí)間未完成的命令 (7) 一次可以執(zhí)行多條命令,命令間用分號(hào);分隔 【如:bp main;bp `view.cpp:120`】,一次打2個(gè)斷點(diǎn) (8) 為了保證windbg流暢運(yùn)行,在調(diào)試時(shí),盡量不要開啟Watch、Locals、Registers、Call Stack、Processes and Threads窗口,直接用command來獲取信息 #啟動(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 // 打開windbg的chm幫助文件 .hh bp // 打開windbg的chm幫助文件bp命令介紹頁 command /? // 打印命令command具體參數(shù)用法 #注釋符 * // 注釋整行 $$ // 注釋(遇到分號(hào)結(jié)束) #配置調(diào)試環(huán)境 注:如果被調(diào)試的模塊(無論移動(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)試器來加載符號(hào),如:?;厮菝?k*)和反匯編命令(u)等。 值得說明的是,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文件沒有對(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 // 為TGame.exe加載符號(hào)信息 .reload /u TGame.exe // 卸載TGame.exe及其載符號(hào)信息 .chain // 顯示已經(jīng)加載進(jìn)來的模塊 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開頭的符號(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í)行空語句(;),斷住 否則繼續(xù)執(zhí)行 bp `ConsoleTest.cpp:40` "j (poi(pVar)>5) ' '; 'g'" // "j (Condition) 'Optional Commands'; 'g'" j為條件表示式:條件斷點(diǎn) pVar指針指向的值>5,執(zhí)行空語句(;),斷住 否則繼續(xù)執(zhí)行 注:Condition表達(dá)式語法默認(rèn)的是MASM表達(dá)式語法。使用復(fù)雜C++表達(dá)式時(shí)我們需要用@@c++()將表達(dá)式包圍??;如:"j @@c++(*pVar>5) ' '; 'g'" --------------------------------- x表示的一個(gè)地址 --------------------------------- 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)用(打開注冊(cè)表鍵值) bu // 保存斷點(diǎn),其用法和bp一樣 bm add_* // 匹配add_開頭的函數(shù),并在這些函數(shù)起始處都打上斷點(diǎn) ba w4 0x0483dfe0 // 當(dāng)對(duì)0483dfe0地址寫操作時(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è)異常?!?span style="color:rgb(255,0,255)">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)試器返回沒有處理了這個(gè)異常,那么系統(tǒng)會(huì)進(jìn)一步分發(fā)該異常, // 如果沒有其他調(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]命令來修改數(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見上述說明) dt WindbgTest!CTest // 查看模塊WindbgTest的CTest的內(nèi)存布局(注:vc6見上述說明) dt WindbgTest!CTest 0x0041f8d4 // 將0x0041f8d4地址處內(nèi)容按照模塊WindbgTest的CTest的內(nèi)存布局來解析(注:vc6見上述說明) Windbg默認(rèn)會(huì)用寄存器ECX里面的值作為this指針地址,其實(shí)這樣是有時(shí)候是錯(cuò)誤的。 dt this // 查看this指針的類型及成員變量(注:vc6見上述說明) dt -b this // 查看this指針的類型及成員變量,如果某一成員變量為結(jié)構(gòu)體,則把其結(jié)構(gòu)成員也一一打印出來 dt _PEB @$PEB // 查看PEB(process's environment block)內(nèi)存結(jié)構(gòu) ?? this->m_nPen // 查看成員變量的值(注:vc6見上述說明) ?? this // 查看this指針中的成員變量(注:vc6見上述說明) ? 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開頭的所有局部變量,函數(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ù)信息 *****************************************/ 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 ====================================================== Windows 7 Ultimate Service Pack 1 [Build 6.1.7601] CallStack: //0x64D90000為模塊MSVCR90.dll的基地址,3AF68為崩潰指令在模塊中的偏移值,(0492B5D0,00074685,0000000C,00462482)為參數(shù)信息 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ù),通過/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)存頁屬性 dd /c 5 7c801e02 // 從7c801e02內(nèi)存處開始以dword為單位顯示內(nèi)存(寬度為:5)【默認(rèn)顯示128字節(jié)長度的內(nèi)容】 dd /c 5 7c801e02 L8 // 從7c801e02內(nèi)存處開始以dword為單位顯示內(nèi)存(寬度為:5)【顯示8個(gè)dword】 da /c 100 7c80ff03 // 從7c80ff03內(nèi)存處開始顯示Ascii字符串(寬度為:100) du /c 100 7c8022f5 // 從7c8022f5內(nèi)存處開始顯示Unicode字符串(寬度為:100) /***************************************** d[a| u| b| w| W| d| c| q| f| D] [/c 列數(shù)] [地址] a = ascii chars *****************************************/ dyb /c 3 7c801e02 // 從7c801e02內(nè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地址寫入Ascii字符串a(chǎn)bc, 不包含結(jié)束符0 eza 0x445634 "abc" // 表示在0x445634地址寫入Ascii字符串a(chǎn)bc, 包含結(jié)束符0 eu 0x445634 "abc" // 表示在0x445634地址寫入U(xiǎn)nicode字符串a(chǎn)bc, 不包含結(jié)束符0 ezu 0x445634 "abc" // 表示在0x445634地址寫入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 dt _HEAP 00140000 // 選取一個(gè)堆的地址,打印該堆的內(nèi)存結(jié)構(gòu) ntdll!_HEAP !heap -a 00140000 // 選取一個(gè)堆的地址,打印該堆的信息,比上面打印內(nèi)存命令更詳細(xì)直觀 Index Address Name Debugging options enabled Heap entries for Segment00 in Heap 00140000 #虛擬內(nèi)存 !vadump // 查看虛擬內(nèi)存布局 #設(shè)置事件發(fā)生時(shí)windbg行為 sx // 顯示windbg遇到每個(gè)異常和事件時(shí)的行為 sxr // 將所有異常和事件過濾器的狀態(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ò)誤處理器沒有處理掉該異常,執(zhí)行會(huì)停止下來并中斷(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
!gle // 打印當(dāng)前線程最近的錯(cuò)誤信息LastError !gle -all // 打印所有線程的最近的錯(cuò)誤信息 !error 897// 顯示錯(cuò)誤碼為897的詳細(xì)描述信息 |
|