怎麼除錯Delphi原始碼

2021-06-05 04:01:22 字數 4367 閱讀 9394

delphi除錯概述2007-06-13 16:15delphi除錯入門級的經典文章,如果是新手的話此文值得好好的讀一讀

delphi除錯概述

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

1. 語法檢查(syntax check)

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

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

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

對於下面這個**,編譯程式將會出現乙個warning:

vara,b:integer;

begin

...if a<100 then

if a<b then begin

...end;

end.

end.

編譯程式會告訴你,在「.」(句號)後面的內容被忽略了,實際上你會發現你漏了乙個begin,同時將最後第二個end後面的「;」(分號)誤寫成「.」(句號)了。

再看看下面的**:

vara,b:integer;

begin

b:=a+1;

end;

編譯程式會給出乙個hint,告訴你a尚未被初始化,通常沒有被初始化的變數其內容是不確定的。

由上可見,編譯程式可以對你的程式進行初步的除錯,協助你排除一些故障。

但是僅僅這樣是完全不夠的,需要更加強大的除錯能力才能勝任更加複雜的程式除錯任務。

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)來同時開啟或禁止多個斷點。

中斷(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):顯示當前程式中有多少執行緒在執行,各執行緒的狀態是什麼?引數是什麼?

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

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

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

Delphi原始碼級動態反彙編除錯

ollydbg是乙個動態反 彙編除錯工具,由於功能非常強大,常常被黑客用來破解軟體。但是一般情況下用它反彙編出來的程式是非常難理解的彙編形式,只有系統api呼叫部份可以看出函式名稱,其它的函式呼叫都是以位址形式出現,這使我們很難分析程式的功能。經過反覆試驗,我終於解決了原始碼級除錯這一難題。這樣就可...

除錯RocketMQ原始碼

拷貝namesrv broker的配置檔案到指定目錄,為了避免直接修改 中的配置檔案。1.1 在f盤建立rocketmq資料夾,建立三個子資料夾conf logs store,我的 中多了dev data的資料夾 1.2 將distribution原始碼conf目錄下的broker.conf log...

kakfa原始碼除錯

一,環境準備 進入原始碼的根路徑,使用gradle編譯 輸入命令 gradle idea 等待一段時間就可以看到編譯成功 gitbash export http proxy 設定 gradlew jar 編譯通過 匯入idea開啟 把client generated generated test拷貝...