《Windows 用戶態程序高效排錯》市場價元 特價元 購買>>
這一部分主要介紹用戶態調試相關的知識和工具包括匯編異常(exception)內存布局堆(heap)棧(stack)CRT(C Runtime)handle/Criticalsection/thread context/windbg/ dump/live debug和Dr Watson等
書中不會對知識點作全面的介紹而是針對知識點在調試中過程中應該如何使用進行說明知識點本身在下面兩本書中有非常詳細的介紹
Programming Applications for Microsoft Windows
Debugging Applications for Windows
排錯的工具調試器Windbg
本節介紹調試器Windbg的相關知識Windbg的使用貫穿本書很多章節它是分析問題的高效工具
Windbg的下載地址是
Install Debugging Tools for Windows bit Version
http://wwwmicrosoftcom/whdc/devtools/debugging/installxmspx
建議安裝到C:\Debuggers目錄後面的例子默認用這個目錄
開發人員寫完代碼通常會在Visual Studio中按F直接進行調試使用Visual Studio自帶調試器能夠非常方便地在源代碼上設定斷點檢查程序的中間變量單步驟執行在完成代碼階段Visual Studio自帶的調試器能夠非常方便地做源代碼級別的排錯
Visual Studio調試器的典型用例是源代碼級別的排錯與其相比Windbg並不是一款針對特殊用例的調試器Windbg提供了一個GUI界面也可以在源代碼上直接用F設定斷點但更多的情況下調試人員會直接用文本的方式輸入調試命令Windbg執行對應的操作用文本的方式返回對應的結果 Windbg的調試命令覆蓋了Windows平台提供的所有調試功能
本節首先對調試器和符號文件作大致的介紹然後針對常用的Windbg調試命令作演示接下來介紹Windbg中強大而靈活的條件斷點最後介紹調試器目錄下的相關工具
對調試器深入的了解後相信讀者就能體會到Windbg和Visual Studio調試器設計上的區別選用最合適的調試器來解決問題
書中不會從Windbg的基本使用方法說起而是著重介紹調試器原理常用的命令Windbg的高級用法和相關的工具如果讀者從來沒有使用過Windbg下面的文章可以提供幫助
DebugInfo:
http://wwwdebuginfocom/
Windows Debuggers: Part : A WinDbg Tutorial
http://wwwcodeprojectcom/debug/windbg_partasp
調試器的功能檢查代碼和資料保存dump文件控制程序的執行
調試器無論是Visual Studio調試器還是Windbg都是用來觀察和控制目標進程的工具對於用戶態的進程調試器可以查看用戶態內存空間和寄存器上的資料對於不同類型的數據和代碼調試器能方便地把這些信息用特定的格式區分和顯示出來調試器還可以把一個目標進程某一時刻的所有信息寫入一個文件(dump)直接打開這個文件分析調試器還可以通過設置斷點的機制來控制目標程序什麼時候停下來接受檢查什麼時候繼續運行
關於調試器的工作原理請參考Debugging Applications for Windows這本書
Windbg及其相關工具的下載地址
http://wwwmicrosoftcom/whdc/devtools/debugging/installxmspx
在安裝好Windbg後可以在windbgexe的主窗口按F彈出幫助這是了解和使用Windbg的最好文檔每個命令的詳細說明都可以在裡面找到
調試器可以直觀地看到下面一些信息
進程運行的狀態和系統狀態比如進程運行了多少時間環境變量是什麼
當前進程加載的所有EXE/DLL的詳細信息
某一個地址上的匯編指令
查看內存地址的內容和屬性比如是否可寫
每個的call stack(需要symbol)
Call stack上每個函數的局部變量
格式化地顯示程序中的數據結構(需要symbol)
查看和修改內存地址上的資料或者寄存器上的資料
部分操作系統管理的數據結構比如HeapHandleCriticalSection等
在Visual Studio調試器中要查看上面的信息需要在很多調試窗口中切換而在Windbg中只需要簡單的命令就可以完成
調試器的另外一個作用是設定條件斷點可以設定在某一個指令地址上停下來也可以設定當某一個內存地址等於多少的時候停下來或者當某一個exception/notification發生的時候停下來還可以進入一個函數調用的時候停下來或跳出當前函數調用的時候停下來停下來後可以讓調試器自動運行某些命令記錄某些信息然後讓調試器自動判斷某些條件來決定是否要繼續運行通過簡單的條件斷點功能可以很方便地實現下面一些任務
當某一個函數被調用的時候在調試器輸出窗口中打印出函數參數
計算某一個變量被修改了多少次
監視一個函數調用了哪些子函數分別被調用了多少次
每次拋C++異常的時候自動產生dump文件
在Visual Studio調試器中也能夠設定條件斷點但靈活性和功能遠不能跟Windbg相比
符號文件(Symbol file)把二進制和源代碼對應起來
當用VC/VB編譯生成EXE/DLL後往往會同時生成PDB文件PDB裡面包含的是EXE/DLL的符號信息
符號是指代碼中使用到的類型和名字比如下面這些都是符號包含的內容
代碼所定義的Class的名字Class的所有成員的名字和所有成員的類型
變量的名字和變量的類型
函數的名字函數所有參數的名字和類型以及函數的返回值
PDB文件除了包含符號外還負責把符號和該符號所處的二進制地址聯系起來比如有一個全局變量叫做gBufferPDB文件不僅僅記錄了gBuffer的類型還能讓調試器找到保存gBuffer的內存地址
有了符號文件當在調試器中試圖讀取某一個內存地址的時候調試器會嘗試在對應的PDB文件中配對看這個內存地址是否有符號對應如果能夠找到調試器就可以把對應的符號顯示出來這樣極大程度上方便了開發人員的觀察對於操作系統EXE/DLL微軟也提供了對應的符號文件下載地址
默認情況下符號文件中包含了所有的結構函數以及對應的源代碼信息微軟提供的Windows符號文件去掉了源代碼信息函數參數定義和一些內部數據結構的定義
From:http://tw.wingwit.com/Article/os/xtgl/201311/10165.html