後一頁
前一頁
回目錄
回首頁
第十二章 異常處理與程式偵錯(三)

12.4.3 斷點的使用 

12.4.3.1 設定斷點 

  設定斷點首先在Code Editor中選取你想設定斷點的代碼行,而後進行如下的任一種操作:

  ● 按一下選取代碼行左邊的空白

  ● F5

  ● 選擇Code Editor加速選擇表的Toggle BreakPoint

  ● 選擇Run|Add Breadpoint打開斷點編輯對話方塊(Edit BreakPoint Dialog Box),而後選擇New去確認一個新的斷點設定或選擇Modify去對一個存在的斷點進行修改

  ● BreakPoint List加速選擇表中選擇Add BreakPoint項 

  斷點必須位於可執行代碼行上,凡設定在注解、空白行、變數敘述上的都是無效的。另外,斷點既可以在設計狀態下設定也可以在執行偵錯狀態下設定。 

12.4.3.2 斷點的操作 

  斷點清單視窗(BreakPoint List Window)列出了所有斷點所在的源檔案標簽、行號、條件以及已通過的次數。如果一個斷點非法或失去功能,則在清單視窗中變灰。

  斷點清單視窗可以通過選擇View|BreakPoint選擇表打開。

斷點清單視窗是斷點操作的基礎。

  1.顯示和編輯斷點處的代碼

  利用斷點清單視窗可以快速找到斷點在源代碼中的位置。

  首先選取斷點而後從加速選擇表中選擇View SourceEdit Source。此時Code Editor更新,顯示該斷點位置處的代碼。如果選擇的是View Source,則斷點清單視窗仍保持活動;如果選擇的是Edit Source,則Code Editor獲得輸入焦點,可以在斷點位置修改源代碼。

  2.斷點功能的喪失和恢復

  使斷點失去功能可以使斷點從目前程式執行中隱藏起來。假如你定義了一個斷點目前並不需要,但可能在以後使用,則這一功能是很有用的。

  斷點清單視窗加速選擇表的Disable BreakPointDisable All BreakPoints項可以使目前選中斷點或所有斷點失去功能。

  加速選擇表中的Enable BreakPointEnable All BreakPoint 可以使相應斷點恢復功能。

  3.斷點的解除

  斷點解除可以從Code Editor或斷點清單視窗中進行。

  從Code Editor:

  ● 把遊標停到包含斷點的行並按F5(或選擇加速選擇表的Toggle BreakPoint)

  ● 按一下包含斷點行左邊的終止符 

  從斷點清單視窗:

  ● 選中欲解除的斷點並選擇加速選擇表的Delete BreakPoint

  ● 解除目前所有斷點,則選擇加速選擇表的Delete All BreakPoints項 

12.4.3.3 修改斷點屬性 

  斷點清單視窗連續按兩下選取斷點或從加速選擇表中選擇Edit BreakPoint項,可以打開斷點編輯對話方塊,用於顯示和修改斷點的屬性。

利用斷點編輯對話方塊可以改變斷點的位置,設定斷點條件。

  斷點條件包括兩種:布爾表示式和通過次數。

  Condition編輯框用於設定布爾表達式條件。如果表達式值為真(或非零)則程式執行在斷點處中止;否則偵錯器將忽略該斷點。

  Pass Count編輯框用於設定通過次數條件,即只有當程式執行在該斷點處通過設定次數時程式執行才在該斷點處中止。這往往用於對回圈體內語句的偵錯。

  有一點應引起注意的是:當ConditionPass Count同時設定時,Pass Count是指滿足條件的通過次數。

  對如下一段程式: 

var

i,Re,s: Integer ;

begin

s := 1;

Re := 0;

for i:=1 to 100 do

Re:=Re+s*i ;

end; 

Re := Re + s*i; 一行設定一斷點。

若條件設定為: 

  Condition :  i = 3

Pass Count:   4

  則當程式中止時偵測i 的值為7。 

12.4.3.4 斷點和程式執行點顏色的設定 

  選擇Option|Environment進入環境設定對話方塊而後選擇Editor Colors頁標籤。此時即可對有關項按自己的希望設定背景和前景色。 

12.4.4 監視數據的值 

  內置偵錯器提供了如下的工具用於監視程式中數據的值:

  ● 監視清單視窗

  ● 計算/修改對話方塊

  ● 調棧視窗 

12.4.4.1 監視表達式 

  監視清單視窗(Watch List Window)顯示程式執行中目前監視表達式的值。

  選擇View|Watches可以打開監視清單視窗。

Code Editor中加入一個監視表達式最方便的方法是:

  1.選中要監視的表達式;

  2.Code Editor加速選擇表中選擇Add Watch把表達式加入到監視清單視窗。

  也可以利用下面的方法產生一個監視表達式:

  1.用下列方法之一打開監視屬性對話方塊(Watch Properties Dialog Box)

●主選擇表中選擇Run|Add Watch

●在遊標處從Code Editor加速選擇表中選擇Add Watch

  ●按Ctrl-F5

  ●連續按兩下監視清單視窗中的一個監視表達式

  ●從監視清單視窗選取一個表達式而後從加速選擇表中選擇Edit

  2.在監視屬性對話方塊的Expression下拉列示方塊中輸入或選擇一個被監視的表達式;

  3.設定表達式的顯示格式和使能狀態。

  與斷點類似,利用加速選擇表也可以使監視表達式功能喪失、恢復或解除監視表達式。 

12.4.4.2 計算/修改表達式 

 選擇Run|Evaluate /Modify可打開計算/修改對話方塊。當按一下Evaluate按鈕時,Expression編輯框中表達式的值顯示在Result欄位中。

  Expression中可以輸入或選擇任何合法的表達式(包括物件的屬性),但不包括;

  1.包含有目前執行點不能引用的局部或靜態變數的表達式;

  2.函數或過程呼叫。

  Expression中的表達式可以帶特定的格式字元用於規定其顯示格式。 格式字元及其功能如下表。 

   表12.8  格式字元及其功能

─────────────────────────────────

格式字元 功 能

—————————————————————————————————

$,H,X 以十六進制格式顯示標量

D 以十進制格式顯示標量

C ASCII碼在0..31的特殊字等顯示為ASCII碼圖形

Fn n個有效數字顯示浮點數

M 以十六進制方式顯示一變數的記憶體轉儲值

P 以段和偏移量格式顯示指標。兩部分皆為四位十六進制值

R 顯示記錄、物件的網欄位標簽和值(例如 X5Y2)

S ASCII碼顯示字元串(包括特殊字元)。用於修改記憶體轉儲值

─────────────────────────────────

  修改表達式的值常用於驗證錯誤解決方案的正確性。在Expression編輯框中輸入或選取欲修改的表達式,按一下Evaluate按鈕觀察表達式的目前值。而後在New Value編輯框中輸入或選中一個新值,並按一下Modify按鈕確認並更新數據項。這種修改只影響特定的程式執行。

  修改表達式的值(特別是指標變數和數群群組下標)可能會引起無法預計的後果。因而使用中要特別小心。 

12.4.4.3 顯示函數呼叫 

  選擇View|Call Stack可以顯示調棧視窗(Call Stack Window)。調棧視窗的頂端列出了應用程式最近的函數呼叫。

利用調棧視窗可以結束目前跟蹤的函數,可以利用加速選擇表項顯示或編輯位於特定函數呼叫處的源代碼

12.5 其它偵錯工具 

  Delphi的內置偵錯器雖然功能很強大,但並不能勝任所有的任務。同時由於內置偵錯器在執行中引起程式環境的細微變化,所以可能影響錯誤的發生方式。為此我們需要使用其它偵錯工具來完成我們的任務。這些偵錯工具包括Turbo DebuggerWinSightWinSpectorBrowserBrowser將在下一節中專門進行介紹。 

12.5.1 Turbo Debugger 

Turbo DebuggerBorland公司推出的第三代語言偵錯器,它雖然還沒有推出完全支援Delphi的新版本,但也基本能勝任一般Delphi程式的偵錯。

  Turbo Debugger在字元模式下執行,但它是一個真正的Windows程式,它僅使用基於字元的介面。由於Turbo Debugger是一個準備控制其它程式的特殊程式,因此不可以使用通常Windows任務切換功能如Alt+Tab

Turbo Debugger的操作大部分與內置偵錯器相同或類似。利用File|Open選擇表載入要偵錯的文件就可以開始一個偵錯過程。

  利用Turbo Debugger必須把偵錯符號資訊儲存在可執行文件中。具體操作見(12. 4.1.1)中介紹。

  Turbo Debugger與內置偵錯器相比,有許多新的功能。

  首先它提供了許多在低級硬體資訊方面的控制。可以完全存取CPU的暫存器、標誌及系統記憶體。用戶可以跟蹤遠指標到記憶體位置並直接檢查它們的內容。Turbo Debugger可以跟蹤進到代碼中,即使得不到源代碼也可以。

  Turbo Debugger支援許多Windows的特殊功能。它可以跟蹤Windows訊息,讓用戶查看程式的局部堆和全局堆,並可以瀏覽包括DLLs在內的群群組成程式的所有代碼單元清單。

  另外Turbo Debugger支援遠端執行能力。可以通過串口鍊結或通過支援NetBIOS的網路組態Turbo Debugger控制另外一台機器。在這種模式下,一台機器顯示偵錯器螢幕,另一台機器顯示被跟蹤的程式。這允許在一個屏上單步執行程式並在另一屏上監視結果。 

12.5.2 WinSight

  WinSight 是一個用於查看Windows 物件並跟蹤訊息的發送和接收的偵錯工具。WinSight的圖示可以在Delphi程式群群組中找到。

WinSight介面分為兩部分,上面為物件樹視窗,下面為訊息跟蹤視窗。如圖12.9所示。

  在實際應用中,用戶可能只是對其中的一部分訊息感興趣,而又不希望它們淹滅在無用資訊之中。為此,用戶可以打開Message選擇表並選擇Selected Windows。按住Shift鍵,按一下物件樹視窗中感興趣的物件,所選取物件的任何訊息都顯示在訊息跟蹤視窗中。

  如果用戶只想跟蹤某些訊息類,則打開Message選擇表並選擇Options ,使用如圖12.10所示的檢查框過濾訊息。 

12.6.6 小結 

  本章介紹的內容,核心是如何增強程式的健壯性並提高開發效率。為此我們首先考察了Delphi的異常處理機制,而後介紹了幾種程式偵錯工具,在您即將結束基礎篇的學習時,這些內容是您步入開發大型應用程式的進階程式員行列的必備武器。

 



後一頁
前一頁
回目錄
回首頁