Delphi在除錯的時候檢視變數的值

2021-06-22 22:01:47 字數 4755 閱讀 4301

delphi除錯概述

除非你的程式只有幾行,否則幾乎不可能一次寫成,因此除錯就非常必要。然而許多初學者不知道如何進行除錯,寫完程式就執行,發現結果不對再看**,這樣覺得非常吃力。這裡,簡單介紹一下delphi所提供的除錯功能。

1. 語法檢查(syntax check)

delphi提供了語法檢查的功能,這個功能和正常編譯很相似,同樣也會給出各類錯誤和警告資訊,但是不會生成**。

delphi的編譯資訊分為4類:fault(故障),error(錯誤),warning(警告)和hint(提示)。fault是指導致編譯程式不能繼續工作的錯誤,例如記憶體溢位等;error是指發現使用者程式不符合某些規定而導致不能按照使用者程式的要求進行處理;warning是指使用者程式使用了某些不符合規定的形式,但是並不影響編譯程式生成目標檔案;hint是指編譯程式對使用者程式的某些形式提出了懷疑。

前兩類資訊是必須要解決的,否則你不能執行你的程式,但是往往會有很多人忽略後兩種資訊。然而,這些資訊卻是非常重要的。

2. 啟動、暫停、中止整合除錯程式

最基本、最重要的除錯手段包括:單步跟蹤、斷點、變數觀察、堆疊檢查等。所有這些功能在delphi的整合除錯程式中都能提供。

當你按下f9(compile and run,編譯並執行)乙個程式時,就已經啟動了delphi的整合除錯程式,而按下ctrl+break(program pause,程式暫停)時則會暫停被除錯程式返回到整合除錯程式中去,再次按下f9會從暫停地地方繼續執行,而alt+f2(program reset,程式復位)則會完全中止被除錯程式的執行,返回整合除錯程式中去。

3 單步跟蹤(step)

所謂單步跟蹤是指一行一行地執行程式,每執行一行語句後就停下來等待指示,這樣你就能夠仔細了解程式的執行順序,以及當時的各種狀況。

注意:雖然object pascal允許在一行內書寫任意多的語句,但是所有的單步跟蹤都以「行」為單位,因此為了便於除錯,主張在一行內只寫一條語句,否則會給你帶來很大的麻煩。

單步跟蹤可以分為step over(跳過)、trace into(跟蹤進入)和trace to next source line(跟蹤到下一條源**行)。

step over和trace into都是執行一行語句,差別在於遇到過程和函式時trace into將會進入過程和函式,而step over不會,而只會把過程和函式作為一條語句執行。

當使用ctrl+break暫停程式時,程式不一定停在你的源**位置上,而可能是在作業系統或者其它模組中,此時整合除錯程式會出現乙個cpu視窗(cpu window),用彙編指令的形式顯示當前的內容,可以用trace to next source line繼續執行程式,直到程式執行到第一條有源**的地方。

4 斷點(breakpoint)

斷點是除錯中非常重要的乙個手段。由於在執行到某些**前需要執行許多其它**,不可能用單步跟蹤一條一條執行過來,這時只要在需要暫停的地方設定乙個斷點,然後讓程式執行,當執行到這個斷點位置時不需要使用者干預就會暫停並返回整合除錯程式。

delphi提供了豐富的斷點功能,包括:源**斷點、指令斷點、資料斷點等。

源**斷點(source breakpoint)是指在你的源程式中設定斷點,指令斷點(address breakpoint)是指在某機器指令處設定斷點,資料斷點(data breakpoint)是指當寫入某變數時暫停使用者程式。

所有的斷點都可以設定更詳細的屬性,包括:條件、通過次數、組、高階操作等。

條件(condition)是指觸發斷點的條件,例如你可以寫:a=10,表示當a等於10時在這個斷點位置暫停;

通過次數(pass count)是指即使符合條件,也需要執行這些次數才n暫停,例如在某斷點設定通過次數為5,則表示當第5次通過這個斷點時才暫停程式,當然,如果有條件存在的話還要符合相當次數的條件;

組(group)是指一組斷點,你可以用乙個名字來標記許多斷點,這樣你可以用禁止或允許組(disable group/enable group)來同時開啟或禁止多個斷點。

高階操作是指和每個斷點相關的一些行為(action),具體如下:

中斷(break):中斷程式,這是預設操作。 

忽略後續異常(ignore subsequent exceptions):通過這個斷點後忽略所有異常(exceptions); 

處理後續異常(handle subsequent exceptions):通過這個斷點後處理異常,這和前乙個操作是對應的; 

記錄資訊(log message),通過這個斷點時記錄一條事件日誌資訊,你可以在事件日誌(event log)中檢視這條資訊; 

表示式求值(eval expression):對指定的乙個表示式進行求值,並且可以通過記錄結果(log result)把這個結果記錄在日誌中; 

禁止/允許組(enable group/disable group):通過這個斷點以後禁止或者允許其它的組,由此可以控制其它斷點的狀態。 

在delphi中除了上述的顯式斷點以外,還提供了隱式斷點:執行到游標(run to cursor)和執行到返回(run until return)。

執行到游標是讓程式到當前游標所在程式行,相當於你在當前游標位置設定了乙個斷點。這是一次性斷點,並且如果在到達這裡前遇到了其它斷點,會停止在那個斷點的地方,同時取消了這個臨時斷點。

執行到返回是用於過程和函式中,執行到過程和函式退出的位置,使得可以迅速返回上層呼叫程式。

5. 變數檢視(watch)/檢查(inspect)

在程式暫停的時候你可以用watch檢視某個變數,按ctrl+f7(add watch,新增檢視)可以在檢視列表(watch list)中增加乙個變數。在watch中你可以檢視變數或者表示式,指定資料的格式,甚至可以指示delphi呼叫某些函式,顯示函式的返回值。

有一種快速檢視模式,稱為local variables(區域性變數),按ctrl+alt+l能夠顯示這個窗體,裡面是當前過程或函式的區域性變數。

delphi還支援一種臨時的求值模式(evaluate/modify),按ctrl+f4顯示求值框,你可以在這裡輸入乙個變數或者表示式,計算其數值,對於變數還可以在執行時改變它的值,這樣如果你已經發現資料有錯,你可以修改它,讓程式繼續執行下去,就像這個數值就是程式得出的一樣。

檢查(inspect),是一種可以進一步檢視變數資訊的手段。把游標放在某個變數前,按alt+f5顯示檢查窗。在這裡可以看到有關這個變數的詳細資訊,包括:型別、值等,這對於類型別、記錄型別尤其有用。和evaluate/modify一樣,你也可以改變這些值。

6. 呼叫堆疊(call stack)

對於某些遞迴呼叫和複雜的巢狀呼叫來說,使用call stack功能能夠方便的檢查函式的呼叫情況。

按ctrl+alt+s可以顯示這個窗體,在最上面的是當前過程或函式,在最下面的往往是你的主程式。例如:

tform1.button1click(???);

project1

這表示project1呼叫了方法tform1.button1click,由於其引數是乙個物件(sender:tobject),不能求值,所以用???表示。雙擊project1可以看出在什麼地方呼叫了tform1.button1click(如果呼叫點沒有源**,則顯示有源**的第一行)。

7. 高階除錯功能

上面所說的是常規的除錯功能,delphi還提供了很多高階除錯功能。

執行緒狀態(thread status):顯示當前程式中有多少執行緒在執行,各執行緒的狀態是什麼?引數是什麼? 

模組(modules):顯示當前程序使用了多少模組,其名稱和位址是多少?這對於除錯dll時很有用。 

cpu/fpu:在組合語言層次顯示**,這能夠更加精確地觀察程式是如何執行的,各暫存器是怎麼變化的。 

程序附著(attach process):為了除錯某些特殊程式(例如windows 2000下的服務【service】),允許先執行使用者程式,再執行除錯程式。 

遠端除錯(remote debug):允許在一台計算機上執行使用者程式,在另外一台計算機上執行delphi,通過網路進行除錯,這對於除錯大型程式很有用,也能除錯那些對系統有特殊要求的程式。 

delphi變數檢視(watch)/檢查(inspect)

在程式暫停的時候你可以用watch檢視某個變數,按ctrl+f7(add watch,新增檢視)可以在檢視列表(watch list)中增加乙個變數。在watch中你可以檢視變數或者表示式,指定資料的格式,甚至可以指示delphi呼叫某些函式,顯示函式的返回值。

有一種快速檢視模式,稱為local variables(區域性變數),按ctrl+alt+l能夠顯示這個窗體,裡面是當前過程或函式的區域性變數。

delphi還支援一種臨時的求值模式(evaluate/modify),按ctrl+f4顯示求值框,你可以在這裡輸入乙個變數或者表示式,計 算其數值,對於變數還可以在執行時改變它的值,這樣如果你已經發現資料有錯,你可以修改它,讓程式繼續執行下去,就像這個數值就是程式得出的一樣。

檢查(inspect),是一種可以進一步檢視變數資訊的手段。把游標放在某個變數前,按alt+f5顯示檢查窗。在這裡可以看到有關這個變數的詳細資訊,包括:型別、值等,這對於類型別、記錄型別尤其有用。和evaluate/modify一樣,你也可以改變這些值。

時間在變,環境在變,我們的思想在變嗎

從前,有兩個飢餓的人得到了一位長者的恩賜 一根魚竿和一簍鮮活碩大的魚。其中,乙個人要了一簍魚,另乙個人要了一根魚竿,於是他們分道揚鑣了。得到魚的人原地就用乾柴搭起篝火煮起了魚,他狼吞虎嚥,還沒有品出鮮魚的肉香,轉瞬間,連魚帶湯就被他吃了個精光,不久,他便餓死在空空的魚簍旁。另乙個人則提著魚竿繼續忍飢...

delphi服務程式 service 的除錯方法

方法一 方法二 2.選擇start settings control panel administrative tools services,將執行services 小應用程式。找到myservice,然後單擊start service 工具欄按鈕 這些步驟適用於windows 2000 在wind...

delphi中如何檢視某個程式在程序中是否已經存在

uses tlhelp32 注意 function findprocess afilename string boolean var hsnapshot thandle 用於獲得程序列表 lppe tprocessentry32 用於查詢程序 found boolean 用於判斷程序遍歷是否完成 b...