一.序言、
軟體調試技術的意義:
1. 在調試上花費時間很多
2. 調試可以解決很多問題,是強大的工具
3. 調試是有穩定的生命週期
4. 調試也是學習技術的好工具
調試視窗:
BreakPoints. Watch, Local, Call Statck, Memory, Disassembly(反組譯碼)等
常用快速鍵:
設定/取消斷點: F9
步入:F11
步過:F10
跳出:Shift + F11
參數設定:需要設定工作目錄,啟動參數等
工程設定中的注意點:關掉編譯最佳化和不關閉編譯最佳化,彙編指令是不一樣的。
參數化:Debuging中Command Arguments中輸入參數:this is a test
二. 提高篇
斷點:
調試器設定斷點的原理:
將指令的第一個位元組儲存,寫入一條INT3指令
在設定檔中只是記錄斷點位置,在實際執行時候替換
進階語言調試器調試產生多條彙編指令,但是並不是執行一條彙編指令就中斷一次,而是針對原始碼執行一行中斷一次
軟體編譯過程
編譯:
編譯期檢查:編譯錯誤,警告
運行檢查:
Run time Error Check
棧指標檢查
局部棧緩衝越界檢查:檢查Cookie值:若緩衝區溢位,則會將Cookie值覆蓋導致檢查Cookie不通過,自動中斷
未初始化的局部變數檢查
儲存偵錯符號的檔案:
單獨的符號檔案:PDB
存放在可執行檔中
偵錯符號:
Global Variables
Local Variables
函數名和函數入口地址
FPO資料(精確定位到原始碼行)
符號檔案:KERNEL32.PDB檔案
符號檔案產生過程:在編譯過程中產生PDB和PE檔案
常用調試器:
WinDbug:
若無符號檔案,則只可做二進位檔案調試
存在符號問件時,需要加入微軟伺服器位址以及本地符號檔案地址,F9設定斷點調試,比VS調試簡單些
Softice
OllyDbg:
在沒有原始碼和符號檔案時,運用該工具查看彙編代碼
Syser
WinDBG,Kd之類的核心調試器:通過穿行發送格式資料包來進行聯絡
遠端偵錯:
在本機中調試其它機器上的程式
目標機設定:
安裝VS Remote Debuging Monitor
運行VS Remote Debuging Monitor,選擇:Tools->Options中的遠端偵錯模式
VS2005設定:在屬性-Debuging中設定
實用篇---調試技巧
條件斷點:
被頻繁調用的子函數,迴圈和多線程可使用條件斷點
F9設定斷點,Alt + F9 進入BreakPoints,選中條件斷點並輸入條件運算式
記憶體斷點:
F9設定斷點,進入偵錯模式
Debuing New Breakpoint, New Data Breakpoint
寫入監視地址:0x12345678或者 &i形式均可
讓程式繼續執行,當指定地址的記憶體內容被改變時,中斷髮生
MessageBox大法
不方便用偵錯模式啟動的程式可以添加一個MessageBox
查看時間日誌
部分無法正常啟動的程式
函數退出時崩潰
一般是緩衝區溢位導致,可以注釋掉部分代碼逐步縮小範圍定位錯誤
釋放記憶體時崩潰
記憶體被重複釋放等導致
查看程式連結依賴的動態連結程式庫:
eXeScope工具
執行個體篇--崩潰分析
應用程式崩潰:
捕捉dump
Windbug分析步驟:
開啟dump,載入符號檔案,執行 !analyze -v指令(分析出錯誤的位置),查看結果
藍屏:
藍屏資訊包括:
錯誤描述
建議措施
技術資訊(停止碼)
轉儲dump資訊
認識藍屏:
是Windows系統終極錯誤報表方式
作業系統檢測到威脅系統安全的行為或者情況,繼續運行可能導致嚴重錯誤,是作業系統的積極動作
藍屏原因:
錯誤驅動
硬體錯誤
核心代碼中的bug以及未處理的異常
應用程式層程式和核心層程式開發的區別:
應用程式層程式出錯可以直接關閉,結束程式,造成的危害相比與核心層程式錯誤來說較小,核心層程式出錯會造成藍屏,停止運行,一般是驅動程式bug造成的。核心層程式的編寫需要更加謹慎。