1. 程式人生 > >Delphi應用程序的調試(二)使用斷點

Delphi應用程序的調試(二)使用斷點

條件斷點 break div windows The ive isa www. tle

Delphi應用程序的調試(二)使用斷點

使用斷點(Using Breakpoints)

當用戶從Delphi IDE 運行程序時,程序全速運行,只會在設置了斷點的地方停住。

New Term

斷點(breakpoint)是一種標記,用以通知編譯器,當程序運行到斷點所在位置時暫停程序的執行。

設置和清除斷點(Setting and Clearing Breakpoints)

斷點的設置可通過點擊Code Editor的溝槽來進行;要在代碼的某一行暫停程序執行,就在溝槽中與該行相對應的位置上點擊鼠標,該行就被設置上一個斷點;此時,溝槽中出現一個斷點圖標(一個紅色圓圈),並且斷點所在行以紅色加亮顯示,如下圖:

技術分享圖片

點擊溝槽中的斷點圖標,與之對應的斷點就會被刪除。也可以按【F5】鍵或從Code Editor的快捷菜單中選擇【Toggle Breakpoint】菜單項來觸發或取消斷點。

Note

只允許在能生成實際代碼的行上設置斷點。在空白行、註釋或聲明行上設置的斷點時無效斷點,當用戶在這一類的行上設置斷點,調試器會提出警告。試圖在下列行上設置斷點,都會產生一個無效斷點警告:

技術分享圖片

可在函數或過程的end語句行上設置斷點。

如果在無效行上設置斷點,Code Editor會以綠色顯示斷點,如上圖所示。

在調試器下運行的程序,在不碰到斷點時,與通常的程序運行完全一樣;當碰到斷點時,IDE會被提到最頂層,並且源代碼中的斷點所在行被加亮顯示。如果使用的是缺省顏色格式,則程序停止處的行以紅色加亮顯示,如下圖,紅色斷點旁有一個綠色小箭頭:

技術分享圖片

New Term

執行點(execution point)是指源代碼中下一步要執行的代碼行。

當用戶一步一步調試程序時,執行點以藍色加亮顯示,並且在Code Editor溝槽中顯示一個綠色箭頭符號。提醒:以藍色加亮顯示的行還未被執行;當恢復程序執行時才執行它。如下圖:

技術分享圖片

Note

當執行點所在行以藍色加亮顯示,除非該行包含一個斷點(此時,該行以紅色加亮顯示)。溝槽中的綠色箭頭是當前執行點的最精確指示,因為它不受加亮顯示顏色的影響。

當程序在斷點處暫停執行時,用戶可查看變量、查看調用棧、瀏覽符號或在代碼中步進。檢查完變量和對象後,可點擊Run按鈕恢復程序的執行,這時應用程序就會再次正常運行,直至碰到下一個斷點。

Note

當程序在斷點處暫停執行後,用戶一般都要檢測代碼編寫錯誤。如果用戶在調試會話中間修改了源代碼,然後按Run按鈕恢復程序執行,IDE就會顯示一個消息框提示用戶是否要重建源代碼;如果用戶選Yes,當前過程就會被終止,源代碼被重新編譯,並重新啟動該程序。

這樣操作就有一個問題,程序無法正常關閉,當前正使用的資源未被釋放。這樣極可能導致內存泄露(memory leaks)。建議大家正常終止程序,然後再重新編譯應用程序。

斷點列表窗口(The Breakpoint List Window)

Delphi IDE記載用戶設置的斷點,可通過Breakpoint List(斷點列表)窗口查看這些斷點。從主菜單上選擇【View | Debug Windows | Breakpoint】菜單項來查看斷點列表,如下圖:

技術分享圖片

Note

Pass欄不是顯示某個斷點被碰上的次數,它只是顯示用戶為斷點設置的通過條件。

1、快捷菜單(Breakpoint List Context Menus)

技術分享圖片

  • Enabled——允許使用或禁止使用某個斷點。如果一個斷點被禁止使用,它在Breakpoint List窗口中的符號就會變灰;它在源窗口中的斷點符號也會變灰;並且該斷點所在行以綠色加亮顯示,表示該斷點被禁用。如下圖:
    技術分享圖片
  • Delete——刪除斷點。
  • View Source——滾動Code Editor中的源文件來顯示包含斷點的源代碼行。
  • Edit Source—— 將編輯光標放置到源代碼中包含斷點的行上。並將輸入焦點切換到Code Editor上。
  • Properties—— 顯示“Source Breakpoint Properties”斷點屬性對話框。
  • Breakpoints—— 顯示斷點有關的子菜單,如下圖:
    技術分享圖片
  • Dockable—— 確定“Breakpoint List”窗口是否可泊位。

Note

快捷菜單中的【Add】菜單項作用不大,因為,在Code Editor中設置斷點要比通過Breakpoint List窗口中的Add命令來添加斷點容易的多。

2、斷點的啟用和禁用(Enabling and Disabling Breakpoints)

用戶在任何時候都可以禁止和啟用斷點。如果用戶想要正常運行程序,就可將程序中的斷點暫時禁用;以後需要時可啟用該斷點而不必重新創建它。調試器忽略被禁用的斷點。

要啟用或禁用一個斷點。在“Breakpoint List”窗口中用鼠標右鍵點擊該斷點,並從快捷菜單中選擇【Enabled】項。

3、修改斷點(Modifying Breakpoints)

要修改斷點,可從“Breakpoint List”窗口中選擇【Properties】菜單項,此時會顯示“Source Breakpoint Properties”對話框,如下圖:

技術分享圖片

修改斷點的主要原因是增加斷點條件,在之後的講解中將要重點介紹。

要刪除一個斷點,可在“Breakpoint List”中選擇該斷點,並按鍵盤上的【Delete】鍵盤。要刪除所有斷點,可單擊鼠標右鍵,然後選擇【Delete All】。

技術分享圖片

下面將要講解斷點的兩種類型:簡單斷點和條件斷點。

簡單斷點(Simple Breakpoints)

簡單斷點是指這樣一種斷點,程序一執行到斷點處就會被掛起。按缺省方式設置的斷點就是簡單斷點。簡單斷點不需要多作解釋。一碰到簡單斷點,程序執行就會暫停,此時調試器等待用戶的輸入。大多數時候都是使用簡單斷點;當用戶需要更多地控制調試過程時,才使用條件斷點。

條件斷點(Conditional Breakpoints)

若碰到的斷點是條件斷點,則僅當預定義的條件滿足時,才會暫停程序執行。

要創建一個條件斷點,可先在Code Editor中設置該斷點;然後從主菜單選擇【View | Debug Windows | Breakpoint】菜單項調出“Breakpoint List”窗口,用鼠標右鍵點擊要設置的斷點並選擇【Properties】菜單項,顯示出“Source Breakpoint Properties”對話框,在此對話框中設置斷點的條件。

條件斷點有兩種類型:

  • 第一種類型是條件表達式斷點
    在“Source breakpoint Properties”對話框中的“Condition”字段中輸入條件表達式。如下圖:
    技術分享圖片
    當程序運行時,碰到條件表達式斷點就會先求條件表達式的值,若條件表達式的值為True,則暫停程序執行;若條件表達式的值為False時,則該斷點被忽略。
    例如:設置的條件表達式為:X > 20;當程序運行到該斷點時,若X大於20則暫停程序的執行;若X不大於20,則程序繼續往下執行。
  • 第二種類型是通過計數(pass count)斷點
    對於一個通過計數斷點,只要當碰上該斷點的次數達到指定次數時,程序才會在該斷點處暫停執行。要指定一個通過計數斷點,可在“Source Breakpoint Properties”對話框中編輯該斷點並為Pass Count字段指定一個值。若將一個斷點的通過計數設置成3,則程序會在第三次碰到該斷點時暫停程序執行。

    Note

    通過計數是從1開始,不是從0開始。就像前面所指出的,通過計數為3,意味著當程序第三次碰上某個斷點時,該斷點才有效。
    當程序需要在程序執行通過某個斷點若幹次後再暫停程序執行來檢查變量、步進調試代碼或執行其他調試任務時,可使用通過計數斷點。

    Note

    條件斷點會放慢程序的執行速度,因為每當碰上條件斷點時,都要對條件求值。在調試期間,如果程序運行緩慢,可檢查一下斷點列表,看是否存在不必要的條件斷點。

    Note

    用戶可靈活運用條件斷點來減慢程序執行速度。如果用戶希望某段程序低速運行以便查看,可在該代碼段中設置一個或多個條件斷點。將斷點的條件設置成永遠不能成立的條件,則程序執行會放慢速度,但不會停住。

運行至光標處命令(The Run to Cursor Command)

還有一個調試命令值得一提,就是“Run to Cursor”命令,可從主菜單【Run | Run to Cursor】選擇此命令。當用“Run to Cursor”命令運行程序時,程序會在包含編輯光標的源代碼行上停止運行,就好像該代碼行上設置有斷點一樣。如下圖:

技術分享圖片

Run to Cursor”可用作臨時斷點。當用戶要馬上檢查某行源代碼時,不必在該行上設置斷點;只需將光標移到這一行上,然後選“Run to Cursor”(或按F4鍵),調試器會在程序運行至該行時暫停程序執行。就好像該行上設置了斷點一樣。使用“Run to Cursor”的好處是:當完成一段代碼的調試後,不必清除斷點。

Delphi應用程序的調試(二)使用斷點