第二篇-近距離觀察(1)
1. 調試可執行程序前的准備
2. 工程選項
3. 設置斷點並闖入可執行程序
4. 察看儲存在變量中的值
5. 使用Watches(觀察)
6. 使用Inspectors(巡視器)
7. 使用Evaluate/Modify(求值/修改)
8. Stepping Through, Over and Around Blocks of Code
9. Stepping的類型
10. Stepping的注解
11. 其他提示
Okay,(再小小准備一下)現在開始追蹤、搜索經過前次的努力後仍然躲在代碼中的bug的時候了,也就是開始跟蹤前一篇文章代碼裡標記過的bug/異常。首先是准備階段。
調試可執行程序前的准備
在我們開始調試可執行程序前,我們需要確保一些設置在大多數情況下的正確性。我將會一條接一條的過一遍,並簡單解釋一下為什麼必須那樣做。(如果您對有些東西感興趣的話,按下幫助按鈕,會有許多更詳盡的內容)。現在就開始吧,先打開Project|Options選項。
工程選項
首先我們在"Compiler"(編譯)標簽處停下。您只需簡單的單擊"Full debug"(完全調試模式)按鈕,我們所需的絕大多數的其余設置就已經搞定了。將"Code optimization"(代碼優化)設為"None"(無)總是件好事,這樣做實際上告訴編譯器:所有的事情都已做好,只需產生機器碼就行了。而不要為了提高一點點運行速度嘗試進行其他的智能優化。(當然,一切都完成之後,您可以打開此項。)這樣做的好處是大大降低了我們調試的難度。因為程序中的代碼與我們書寫的一樣,沒有被編譯器優化過。在"debugging"(調試)面板中,將"Debug information"(調試信息)選上(點一下),並且必須設置為"Line number information"(行數信息)。我還建議將"Disable inline expansions"(禁用內聯擴展)一項選上。內聯擴展對發布的代碼來說很好,但調試時最好還是關掉此項,他只會讓您更頭痛。
然後是"Pascal"標簽,尤其在您的工程裡連接了Pascal單元或使用了基於Pascal的VCL控件時(若您擁有其Pascal源碼時,編譯器會自動使用此節中的設置重新編譯)。這裡您必須將"Optimization"優化選項禁用,然後通常我會將"debugging"(調試)部分的所有選項選上(打鉤)。
接下來是"Linker"(鏈接)標簽,我們需要選上"Create debug information"(生成調試信息)。"Use dynamic RTL"(使用動態RTL)以及"Don’t generate state files"(不要生成狀態文件)是造成麻煩的選項。我通常都會使用狀態文件(這樣允許增量鏈接,但會在編譯目錄下產生一個4倍於可執行程序或更大的文件),換個角度來說,這樣會增加鏈接大工程時的速度。而使用dynamic RTL本身就是個爭論,尚有很多贊同和反對的討論。
下一個是"Directories/Conditionals"(路徑/條件)標簽。在這裡我們想要設定"Directories/Conditionals"(調試源路徑)的值。我們永遠都應將此處設定為$(BCB)\source\vcl,但是如果您有任何其他的組件附加的話,通常將它們的路徑也加上是個好主意(路徑與路徑之間用”;”分隔或者您可以用按下…按鈕彈出的對話框來設定它們)。
最後也是最重要的設置是在"Packages"(程序包)標簽上。根據所有恰如其分的調試經驗您必須禁用"Build with runtime packages"(帶運行時程序包編譯)。這麼做的原因是程序包本身不包含而且不能包含調試信息。這樣做,也許不利於您跟蹤標准的VCL代碼,例如想看清楚VCL函數y中參數x是如何起作用的時候。但是大多數時候,您這麼做將會發現調試器將您的絕大多數“症狀”歸結給VCL,盡管“病因”就在您的源代碼中(或在其他的組件中(這已經在我們所有人身上發生了))。一旦您發布您的正式版本時,您可以決定是否使用程序包。(譯者注:程序包的本質是一個特殊的DLL,不帶運行程序包(靜態)編譯可以讓您的程序脫離Cbuilder獨立運行。),但在調試時,請禁用掉。按下OK按鈕,我們已經准備好啦。下一個對話框只需打開一次,但最好還是來檢查以下我們在這裡的設定是否正確。好了,打開”Tools|Debugger Options…”吧。