調試器,無論是Visual Studio調試器還是Windbg,都是用來觀察和控制目標進程的工具。對於用戶態的進程,調試器可以查看用戶態記憶體空間和暫存器上的資料。對於不同類型的數據和代碼,調試器能方便地把這些信息用特定的格式區分和顯示出來。調試器還可以把一個目標進程某一時刻的所有信息寫入一個檔案(dump),直接打開這個檔案分析。調試器還可以通過設定斷點的機制來控制目標程式什麼時候停下來接受檢查,什麼時候繼續運行。
簡介
進程運行的狀態和系統狀態,比如進程運行了多少時間,環境變數是什麼。
當前進程載入的所有EXE/DLL的詳細信息。
某一個地址上的彙編指令。
查看記憶體地址的內容和屬性,比如是否可寫。
每個的Call stack(需要symbol)。
Call stack上每個函式的局部變數。
格式化地顯示程式中的數據結構(需要symbol)。
查看和修改記憶體地址上的資料或者暫存器上的資料。
部分作業系統管理的數據結構,比如Heap、Handle、CriticalSection等。
在Visual Studio調試器中,要查看上面的信息,需要在很多調試視窗中切換。而在Windbg中,只需要簡單的命令就可以完成。
調試器的另外一個作用是設定條件斷點。可以設定在某一個指令地址上停下來,也可以設定當某一個記憶體地址等於多少的時候停下來,或者當某一個exception/notification發生的時候停下來。還可以進入一個函式調用的時候停下來,或跳出當前函式調用的時候停下來。停下來後可以讓調試器自動運行某些命令,記錄某些信息,然後讓調試器自動判斷某些條件來決定是否要繼續運行。通過簡單的條件斷點功能,可以很方便地實現下面一些任務:
當某一個函式被調用的時候,在調試器輸出視窗中列印出函式參數。
計算某一個變數被修改了多少次。
監視一個函式調用了哪些子函式,分別被調用了多少次。
每次拋C++異常的時候自動產生Dump檔案。