windbg中的調(diào)試指令有三種: ?http://www.360doc.com/content/16/1110/14/30953065_605412205.shtml
1. 基本命令: 調(diào)試器自帶喇聊,提供最基本的調(diào)試功能鞍爱,不區(qū)分大小寫。 例如 bp ,g ?,dt ,dv ,k固惯,s等
2. 元命令:調(diào)試器自帶,以“.”開頭. 提供基本命令沒有提供的功能缴守。例如 .reload ?.sympath等
3. 擴(kuò)展命令:外部加入的命令葬毫,以“!”開頭屡穗。用于擴(kuò)展某一方面的調(diào)試功能贴捡,其實現(xiàn)在動態(tài)加載的模塊中。例如:!analyze
使用村砂;分隔符烂斋,可以在一行輸入多個命令。使用 ctrl + break 可以終止一個命令础废。當(dāng)輸入框顯示為busy時汛骂,即使輸入框可以輸入命令,輸入的命令也不會立刻執(zhí)行评腺。
一. windbg 啟動調(diào)試的辦法
分為兩種:
1. 命令行方式啟動:(又分為打開和附加兩種方式)
windbg ?- i ? ? ? ?// 將windbg設(shè)置為默認(rèn)調(diào)試器
windbg “notepad” ?arguments ? //使用windbg 啟動notepad調(diào)試帘瞭,設(shè)置啟動參數(shù)
windbg -p ?4200 ? ?//使用windbg 附加到一個正在運行的PID = 4200的進(jìn)程
windbg -pn "notepad" ?//使用windbg附加到一個正在運行的名字為"notepad"的進(jìn)程
2. 圖形界面方式:直接運行windbg.exe
二. 常用的元命令
1. ? .restart ? ? ?//重啟并調(diào)試
2 ? .kill ? ? ? ? ? ? //強(qiáng)制結(jié)束當(dāng)前調(diào)試
3. ?.help ? ? ? ? ?//打印出所有元命令
4. ? .hh ? ? ? ? ? ?//打開windbg ?chm幫助文檔
三. 常用基本命令
1. ?搜索命令
? ? ? ?s?-a?0012ff40?L0x20?"Hello" ? ? //搜索ansi字符串“hello”, 從0012ff40地址開始歇僧, 長度是 0x20的范圍。即搜索范圍是 0012ff40~ 0012ff60.
?2. ?斷點命令
? ? ? bp?0040108c ? ? ? ? ? ? //直接在地址下斷
? ? ??bp test1!Max ?锋拖; bp ?Max ? ? ? ? ?//直接在函數(shù)名上下斷
? ? ? bp ?'test1.cpp:30' ? ? ? ? ? ? ? ? ? ? ? ? //在test1.cpp第30行下斷
? ? ? bp ?CObject::CObject ? ? ? ? ? //在CObject構(gòu)造函數(shù)上下斷
? ? ?bp ? kernel32!CreateFileA ? ? ?//在kernel32.dll模塊CreateFileA函數(shù)頭位置下斷
? ? ?bp ?TestCommand!CObject::add ? //在TestCommand.dll模塊的CObject類函數(shù)add頭部下斷诈悍。
? ? ?bp?`ConsoleTest.cpp:40`?".if (poi(pVar)>5) {};{g}"
? ? ? //?".if (Condition) {Optional Commands}; {g}" ? ?條件斷點 pVar指針指向的值>5,執(zhí)行空語句(;)兽埃,斷住 ?否則繼續(xù)執(zhí)行
? ? ? bu ?test1!Max ?侥钳;bu ?Max ? ? ? ? ?//在函數(shù)的開頭下斷
? ? ??bm add_* ? ? ? ? ? ? ? ? ? ? //?匹配add_開頭的函數(shù),并在這些函數(shù)起始處都打上斷點
? ? ?ba w4 0x0483dfe0//?當(dāng)對0483dfe0地址寫操作時停下柄错,前面要帶上0x舷夺,否則會報錯。
? ? ? ? ? //ba [r|w|e] [Size] Addr ? ???[r=read/write, w=write, e=execute], Size=[1|2|4 bytes]
? ? ? ? ? ?//這個指令比較強(qiáng)大售貌,可以下內(nèi)存訪問给猾,寫入以及執(zhí)行斷點。 ?內(nèi)存大小Size :單字節(jié)颂跨, 雙字節(jié)敢伸,4字節(jié),8字節(jié)恒削。
?3. 斷點管理
bl ? ? ? //?列出所有斷點 ? ? breakpoint ?list
bc * ? ? //?清除所有斷點 ? ?breakpoint ?clear
bc 1 ? ? //?清除1號斷點
bc 1 2 5 ? ? ?//?清除1號池颈、2號尾序、5號斷點
be * ? ? ? //?啟用所有斷點 ? breakpoint ??enable
be 1 ? ? ?//?啟用1號斷點
be 1 2 5 ? ? //?啟用1號、2號躯砰、5號斷點
bd * ? ? ?//?禁用所有斷點 ??breakpoint ?disable
bd 1 ? ? //?禁用1號斷點
bd 1 2 5 ? ? ?//?禁用1號每币、2號、5號斷點
4. 斷點執(zhí)行
g ? ? ? //?Go(F5)
gu ? ? //?執(zhí)行到當(dāng)前函數(shù)完成時停下【Go Up】
p ? ? ?//?單步執(zhí)行(F10) ?【Step】
?pc ? ? //?執(zhí)行到下一個函數(shù)調(diào)用處停下【Step to ?Next Call】
?pa 7c801b0b ? ? ?//?執(zhí)行到7c801b0b地址處停下 ?【Step to Adress】
?t ? ? ? ?//?Step into(F11) 【Trace】
tc ? ? ? //?執(zhí)行到下一個進(jìn)入點處停下 【Trace to Next Call】
ta 7c801b12 ? ? ? //?執(zhí)行到7c801b12地址處停下 【Trace to Adress】
5. ?進(jìn)程相關(guān)
| ? ? ? ? //?列出調(diào)試進(jìn)程
|* ? ? ? ?//?列出調(diào)試進(jìn)程
6. ?線程相關(guān)
~ ? ? ? //?列出線程
~* ? ? ? // 所有線程
~* k ? ? //?所有線程堆棧信息
~* r ? ?//?所有線程寄存器信息
~. ? ? ? //?查看當(dāng)前線程
~0s ? ? ?// 查看主線程
~# ? ? ?//?查看導(dǎo)致當(dāng)前事件或異常的線程
7. ?模塊相關(guān)
lm ? ? //列出進(jìn)程加載模塊?
8. 查看變量
dt ? ? i_c ? ? ? ?//查看變量地址琢歇, 類型兰怠, 值
dt ntdll!* ? ? ?//?顯示ntdll里的所有類型信息
dt ?*!*IMAGE_DOS* ? ??// 顯示所有模塊中含有IMAGE_DOS字符的類型信息
dt myApp!g_app ? ? ? ? ? ? // 表示顯示myApp進(jìn)程里全局變量g_app的內(nèi)存布局
dt WindbgTest!CTest ? ? ? // 查看模塊WindbgTest的CTest的內(nèi)存布局
dt WindbgTest!CTest 0x0041f8d4 ? ? ? ? ?// 將0x0041f8d4地址處內(nèi)容按照模塊WindbgTest的CTest的內(nèi)存布局來解析
?dt this ? ? ? ? ? ? ? ? ? //?查看this指針的類型及成員變量
dt ?-v ? _PEB @$PEB ? ? ? ? ? // 使用詳細(xì)模式查看PEB(process's environment block)內(nèi)存結(jié)構(gòu)
dt ? tagMSG 0x0336e54c ? ? ? ? ? ? ?// 類型要使用tagMSG,不能使用typedef產(chǎn)生出的MSG
typedef ?struct ??tagMSG{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
dv ? ? ? ? ? ? ? //?顯示當(dāng)前函數(shù)內(nèi)所有局部變量矿微,函數(shù)參數(shù)的值 ??
dv ?nCount ? ?//?查看局部變量nCount的值
x ? ? ? ? ? ? ?//顯示當(dāng)前函數(shù)內(nèi)所有局部變量?痕慢,函數(shù)參數(shù)的值, 包括變量地址涌矢、
x ? nCount ??//?查看局部變量nCount的值 和地址
9. ?查看堆棧
k ? ? ? ? ?//?顯示當(dāng)前調(diào)用堆棧
kn ? ? ? ?//?帶棧編號顯示當(dāng)前調(diào)用堆棧
kb ? ? ? ? //?打印出前3個函數(shù)參數(shù)的當(dāng)前調(diào)用堆棧
kb 5 ? ? ? ?//?只顯示最上的5層調(diào)用堆棧
kv ? ? ? ? ? ? // 在kb的基礎(chǔ)上增加了函數(shù)調(diào)用約定等信息
kp ? ? ? ? //?顯示每一層函數(shù)調(diào)用的完整參數(shù)掖举,包括參數(shù)類型、名字娜庇、取值(必須是完整符號的情況下塔次,private symbols);注意:若程序被優(yōu)化名秀,這些值不一定對
kd ? ? ? ? // 打印堆棧的地址
dds ? ? ? ?//顯示棧幀
10. 顯示反匯編
u ? ? ?//顯示當(dāng)前eip位置往后的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)容
11. ?顯示寄存器
r ? ? ? ? ? ? ? ?//?顯示所有寄存器信息及發(fā)生core所在的指令
r eax, edx ? ? //?顯示eax,edx寄存器信息
r eax=5, edx=6 ? ? ? //?對寄存器eax賦值為5匕得,edx賦值為6
12. 顯示內(nèi)存
!address ? ? ? // 查看進(jìn)程的所有內(nèi)存頁屬性
!address 7ffd8000 ? ? ? // 查看7ffd8000地址處內(nèi)存頁屬性
dd /c 5 7c801e02 ? ? ?// 從7c801e02內(nèi)存處開始以dword為單位顯示內(nèi)存(寬度為:5)
dd /c 5 7c801e02 L8 ? ?// 從7c801e02內(nèi)存處開始以dword為單位顯示內(nèi)存(寬度為:5)【顯示8個dword】
da /c 100 7c80ff03 ? ? // 從7c80ff03內(nèi)存處開始顯示Ascii字符串(寬度為:100)
du /c 100 7c8022f5 ? ? // 從7c8022f5內(nèi)存處開始顯示Unicode字符串(寬度為:100)
s -w 522e0000 L0x100 ?0x1212 0x2212 0x1234 ? ?// 表示在起始地址522e0000之后的0x100個單位內(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地址寫入Unicode字符串a(chǎn)bc,?不包含結(jié)束符0
ezu 0x445634 "abc" ? ?// 表示在0x445634地址寫入Unicode字符串a(chǎn)bc, 包含結(jié)束符0
ed nCounter 80 ? ? ?// 將變量nCounter的值修改為80(注:80為10進(jìn)制還是16進(jìn)制继榆,還是其他,取決于當(dāng)前進(jìn)制)
.writemem D:\Test\0041a5e4.bin 0041a5e4 L0x1000 ? // 將內(nèi)存地址處0x0041a5e4后面0x1000長度的內(nèi)容拷貝存儲到D:\Test\0041a5e4.bin中
13 查看堆
!heap -s ? ? // 顯示進(jìn)程堆的個數(shù)(每一項是一個堆汁掠,也就是_HEAP結(jié)構(gòu)指針略吨,對應(yīng)的API是HeapCreate)
dt _HEAP 00140000 ? // 選取一個堆的地址,打印該堆的內(nèi)存結(jié)構(gòu)
!heap -a 00140000 ? // 選取一個堆的地址考阱,打印該堆的信息翠忠,比上面打印內(nèi)存命令更詳細(xì)直觀
14. 虛擬內(nèi)存
!vadump ? // 查看虛擬內(nèi)存布局
15. 查看句柄
!handle ??// 查看所有句柄的ID