標籤:des blog http 使用 檔案 資料 2014 art
1,
.reload
k 當前呼叫堆疊。
u 當前正在執行的代碼。
2,
~ 查看被調試進程中的線程資訊
每一行是一個線程的資訊。第一行中,0 表示這個進程的編號;1ff4.1038 是 16 進位數
字,前者是當前進程的進程 ID,後者是線程 ID;後面的資訊是線程狀態和 Teb 地址。第二
行的線程編號前有一個點號“.”,表示這是當前線程,也就是剛才使用 u 和 k 命令查看到的
線程。
0:046>,冒號前的數字表示當前的進程號,同時調試多個進程
時,每個進程都會被指派一個進程號;冒號後的 000 表示線程號。
進行核心調試時,如果是單一處理器系統,提示符是 kd>的形式;如果
是多處理器系統,則是 0: kd>的形式,前面的 0 表示處理器號。
3,
~threadIDs 切換到指定threadID線程。
4,
軟斷點
bp: 可以直接對某個代碼地址設定斷點。
0:000> bp TestModule!main
在TestModule內的main函數設定斷點。同直接F9。
bl 查看已經存在的斷點,bd禁用斷點,de重啟斷點,bc刪除斷點。
0:000> bl
0 e 00401030 [C:\Users\NetRoc\Desktop\TestDebug1\T estDebug1.cpp @ 23]
1 e 0040105d [C:\Users\NetRoc\Desktop\TestDebug1\T estDebug1.cpp @ 27]
如上面命令輸出中的第二行,1 表示斷點 ID。當禁用、重新啟或刪除斷點,或者其他命令來操作這個斷點時,都需要用到這個 ID;
第二個“e”表示斷點是啟用的,如果是“d”則表示當前被禁用,如果帶“u”則說明是後面將要介紹的未定斷點;第三列的 0040105d 是該斷點的地址;
後面的內容是斷點所在的源檔案和行號。
對於還沒有載入到記憶體中的模組,比如在調用了 LoadLibrary 之後才載入的DLL。如果使用 bp 來對這個模組中的函數設定斷點,會找不到符號,這時就會被調試器自動轉變成用 bu 命令來設定的未定斷點。
bu 可以對還不能識別的符號設定斷點,當系統中有新模組載入進來時,調試器會對未定斷點再次進行識別,如果找到了匹配的符號則會設定它。
對於bu的斷點上面斷點ID後面的e顯示是eu,表示啟用的未定斷點。
5,
硬斷點 ba:
ba 訪問斷點可以在某個記憶體位址處的資料被讀取、寫入或者執行的時候中斷下來。
首先用.restart 命令重新啟動偵錯目標。
對局部變數 x 有賦值操作 x *= 10 。
輸入 ba w4 @@C++(&x)命令。“&i”表示變數 i 的地址,“w”表示寫入操作,“4”表示只處理&x地址處 4 位元組的寫入操作。F5 運行,程式被成功中斷下來 Breakpoint 1 hit。
WinDbg 的資料斷點是通過 CPU 硬體斷點實現的。而 DRx 寄存器所設定的記憶體訪問斷
點屬於陷阱(Trap)而不是錯誤(Fault),CPU 對陷阱的處理是執行完該條指令後觸發異常。因
此 WinDbg 只能在之後的一條指令處斷下來。
Windows 調試工具支援兩種文法的運算式:MASM 文法和 C++文法。如果沒有特別指
明的話,預設是使用 MASM 運算式文法。一般來說,MASM 文法的運算式用來表示地址比
較方便,而 C++運算式用來表示結構或者類成員比較方便。可以通過@@C++(…)或者
@@masm(…)來包含運算式以明確指明所使用的文法。當使用 MASM 文法時,可以用雙冒
號(::)或者雙底線(__)來表示類成員;但是使用 C++文法時則只能使用雙冒號。
6,
d :查看記憶體
db :按byte查看記憶體
dd : 按DWORD查看記憶體
dv :查看當前範圍下局部變數的類型和值
? x : ?運算式求值命令常常用來查看符號所代表的值。 ? x 命令,它可以顯示符號 x 對應的值,即局部變數 x的地址。
r :查看或者修改寄存器和偽寄存器