掌握C++ builder的除錯藝術(2).1

來源:互聯網
上載者:User

第二篇-近距離觀察(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…”吧。

對話方塊最下方的"Integrated debugging"(整合調試器)選項是關鍵所在。確信已經打上鉤。按下OK按鈕準備編譯可執行程式吧。我建議重新來一次徹底的編譯(選擇Project|Build All),如果您修改過您的設定的話(尤其是改變”building with packages”方式後)。這將保證我們的所有程式單元按照我們所希望的那樣被編譯。

設定斷點並闖入可執行程式

象您所見過的其他任何一款調試器一樣,C++Builder提供強大的斷點設定功能。基本上,斷點是指代碼中的一個點,程式執行至此停下(與退出不同,這隻是執行中的暫停)並將控制權交還給調試器。設定一個斷點相當容易。只需在您想要設定的程式碼行左側的灰色槽形地區點擊,您會看到一個紅點出現,這一行也會變紅。程式運行到這一點就會暫停,將控制權交還給調試器。

您也許會問如果我不想每次都停下來呢?當然可以,而且還很容易做到,這取決於您暫停程式的標準是什嗎?(譯者註:條件斷點)。在剛才那個斷點(紅點)上右擊滑鼠並從快顯功能表上選擇” Breakpoint Properties”(斷點屬性)。此處可以設定兩種屬性"Condition"(條件)和"Pass Count"(通過次數)。Condition(條件)屬性太方便了。您可以利用if()語句輸入幾乎是任意的條件。但請牢記條件中的所有變數,對此斷點都應是可見的。條件屬性並未被編譯器編譯到執行程式中,而是在運行時,當程式運行至斷點暫停後,檢查斷點的條件是否滿足。條件為真,停下,否則讓程式繼續運行。另一個屬性"Pass Count"(通過次數)也很容易理解。斷點將被通過Pass Count次後停下。結合使用這兩個屬性,在調試您的代碼時,您可以設定非常嚴格的斷點。

還有一件要牢記的是,當您在調試器中發生異常時,會以產生異常處的那一行代碼上的斷點的形式出現。這種情況很容易製造。一旦您得到一個異常後應做的步驟我會在以後展示如何在堆棧中回溯並跟蹤找出異常發生的真正原因(如引起異常產生的那一小片代碼)。

另一個要牢記的提示是當您運行您的程式時,代碼視窗左側有藍點的任意一行都可以設成斷點。所有非法的斷點將會變為紅點中帶一個黃色的小叉,這一行代碼也會變成黃褐色。合法的斷點則變為紅點中帶一個綠色的小鉤。運行時,您可以設定/修改任意一點,斷點立即生效而無須重新編譯。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.