初级教程之---delphi调试
一、準(zhǔn)備調(diào)試?? ?
? Delphi 在 IDE 內(nèi)部集成了一個(gè)調(diào)試器,因而對(duì)程序的調(diào)試不用離開(kāi)集成開(kāi)發(fā)環(huán)境(IDE)就可以進(jìn)行。該調(diào)試器能夠控制程序的運(yùn)行、監(jiān)視程序的輸出、檢查和修改變量的值。
在調(diào)試程序之前,必須保證程序代碼已經(jīng)沒(méi)有語(yǔ)法錯(cuò)誤,還要正確設(shè)置一些選項(xiàng)。為此,需要使用【Project】菜單中的【Options】命令打開(kāi)【Project ?Options】對(duì)話框。
打開(kāi)【Compiler】對(duì)話框,選中【Debug information】復(fù)選框(默認(rèn)為選中)。這樣,編譯器將把 所有的調(diào)試信息加到.dcu 文件和.exe 文件中。
VCL 的代碼都是仔細(xì)調(diào)試過(guò)的,一般不會(huì)有錯(cuò)誤。如果仍然不放心,想跟蹤進(jìn)入VCL的內(nèi)部,則需要選中【Use Debug DCUs】復(fù)選框。 要說(shuō)明的是,調(diào)試信息將使可執(zhí)行文件增大,但不影響程序的性能和對(duì)內(nèi)存的需求。
盡管如此,調(diào)試結(jié)束后,最好要打開(kāi)【Project Options】對(duì)話框,在【Compiler】選項(xiàng)卡中,清除【Debug information】復(fù)選框,再重新編譯程序。這樣,程序中就不包含任何調(diào)試信息。要使用內(nèi)部集成調(diào)試器來(lái)調(diào)試程序,還必須使用【Tools】菜單中的【Debugger Options】 命令打開(kāi)【Debugger Options】對(duì)話框,選中【Integrateddebugging】
復(fù)選框(默認(rèn)為選中)。否則,【Run】菜單中的調(diào)試命令將變灰。但要說(shuō)明的是,內(nèi)部集成的調(diào)試器可能會(huì)與某 些軟件沖突,從而引起應(yīng)用程序運(yùn)行異常。因此,在調(diào)試程序時(shí)最好把可能引起沖突的軟 件退出運(yùn)行。
? ? 使用【Tools】菜單上的【Environment Options】命令打開(kāi)【Environment Options】對(duì)話框,再打開(kāi)【Preferences】選項(xiàng)卡。如果選中【Hidedesigners on run】復(fù)選框,當(dāng)程序運(yùn)行 時(shí),【ObjectInspector】和【Form】設(shè)計(jì)器將關(guān)閉,以騰出屏幕上的空間。如果選中【Minimizeon run】復(fù)選框,當(dāng)程序運(yùn)行時(shí),IDE 將最小化,以避免屏幕上內(nèi)容太多太亂。不過(guò),當(dāng)程 序暫停運(yùn)行時(shí),IDE 的窗口會(huì)重新恢復(fù)成原始大小。
二、設(shè)置調(diào)試器的選項(xiàng)
1.? 設(shè)置調(diào)試器選項(xiàng)
要設(shè)置調(diào)試器的選項(xiàng),可以使用【Tools】菜單中的【Debugger ?Options】命令打開(kāi)
【DebuggerOptions】對(duì)話框,如圖 7.2 所示。在其中的【General】選項(xiàng)卡、【Event Log】 選項(xiàng)卡、【Language Exceptions】選項(xiàng)卡和【OS Exceptions】選項(xiàng)卡中,可以設(shè)置調(diào)試的一 些環(huán)境、配置及方法等。
2.?編譯指令
圖 7.2? ?【Debugger Options】對(duì)話框
默認(rèn)情況下,上述設(shè)置對(duì)整個(gè)項(xiàng)目的所有單元都有效。不過(guò),也可以讓這些設(shè)置只對(duì)部分單元有效,因?yàn)橛行﹩卧赡軟](méi)有問(wèn)題,不需要調(diào)試。
要使某個(gè)單元不包含調(diào)試信息,就在這些單元中加入適當(dāng)?shù)木幾g指令,例如:[delphi]?view plaincopy
3.? 自定義調(diào)試器的顏色
在前面已提到,代碼編輯器可以用不同的顏色顯示不同的語(yǔ)法成分,在使用調(diào)試器調(diào)試程序時(shí)也有這個(gè)功能。例如,通常斷點(diǎn)用白底紅色表示,當(dāng)前執(zhí)行點(diǎn)用白底藍(lán)色表示。 要自定義調(diào)試器的顏色,可以使用【Tools】菜單上的【Editor Options】命令打開(kāi)【Editor Properties】對(duì)話框,再打開(kāi)【Colors】選項(xiàng)卡,在【Element】框中選擇某種語(yǔ)法元素,然后設(shè)置它的前景顏色和背景顏色。
三、控制程序的運(yùn)行
3.1單步執(zhí)行
? ?當(dāng)調(diào)試信息編譯了程序后,就可以調(diào)試程序了,調(diào)試器將接管對(duì)程序運(yùn)行的控制,但 程序的運(yùn)行結(jié)果與在非調(diào)試狀態(tài)下運(yùn)行沒(méi)有什么兩樣,包括建立窗口、接受用戶輸入、計(jì)算數(shù)值、響應(yīng)事件、訪問(wèn)數(shù)據(jù)庫(kù)等均照常進(jìn)行。
通過(guò)【Run】菜單中的【Step ?Over】命令,可以單步執(zhí)行程序。所謂單步執(zhí)行,就是 一次只執(zhí)行一行(一個(gè)指令),這樣就可以知道哪一行或指令引起了運(yùn)行期錯(cuò)誤或邏輯錯(cuò)誤。
【StepOver】命令將把整個(gè)過(guò)程或函數(shù)當(dāng)做一行。如果把幾條語(yǔ)句寫在一行上,調(diào)試 器將把這幾條語(yǔ)句當(dāng)做一條語(yǔ)句。這樣,就無(wú)法單獨(dú)調(diào)試其中的某一個(gè)語(yǔ)句。如果把一條長(zhǎng)語(yǔ)句分成幾行寫,調(diào)試器仍然把這幾行當(dāng)做一行。
調(diào)試器每執(zhí)行一行,當(dāng)前執(zhí)行點(diǎn)就自動(dòng)移到下一個(gè)要執(zhí)行的行上,但不一定是源代碼的下一行。例如,若正在執(zhí)行的是 goto 語(yǔ)句,當(dāng)前執(zhí)行點(diǎn)將移到 goto 語(yǔ)句跳轉(zhuǎn)到的行上。
另外還有一種情況就是,如果開(kāi)啟了優(yōu)化編譯的選項(xiàng),某些源代碼行將被合并或越過(guò),這時(shí)候,當(dāng)前執(zhí)行點(diǎn)不會(huì)移到這些行上。
為了清晰地看出當(dāng)前執(zhí)行點(diǎn)在哪兒,代碼編輯器將用白底藍(lán)色顯示當(dāng)前執(zhí)行點(diǎn),同時(shí),在“裝訂區(qū)”顯示一個(gè)綠色的箭頭指向當(dāng)前執(zhí)行點(diǎn),如圖 7.3 所示。
圖 7.3? ?當(dāng)前執(zhí)行點(diǎn)
3.2跟蹤執(zhí)行
【Run】菜單中的【Trace? Into】命令用于跟蹤程序。與單步執(zhí)行相似,這條命令一次 也只執(zhí)行一行。不同的是,執(zhí)行到有函數(shù)調(diào)用的行時(shí),這條命令將進(jìn)入函數(shù)的內(nèi)部。
如果程序鏈接了外部代碼諸如動(dòng)態(tài)鏈接庫(kù),只要?jiǎng)討B(tài)鏈接庫(kù)包含了符號(hào)調(diào)試信息,就 可以跟蹤進(jìn)入這些外部代碼。否則,調(diào)試器將把動(dòng)態(tài)鏈接庫(kù)當(dāng)做一行處理。
在調(diào)試過(guò)程中,可以根據(jù)需要交替使用單步執(zhí)行和跟蹤執(zhí)行。例如,對(duì)有疑問(wèn)的調(diào)用 命令使用跟蹤執(zhí)行,使控制進(jìn)入被調(diào)用部分內(nèi)部,調(diào)試該被調(diào)用部分。而對(duì)有把握的調(diào)用命令使用單步執(zhí)行,從而直接跳過(guò)被調(diào)用部分的調(diào)試,這樣能提高調(diào)試效率。
【Trace Into】命令也能夠進(jìn)入事件句柄的內(nèi)部,就像進(jìn)入一般的函數(shù)內(nèi)部一樣。要注 意的是,OnPaint 事件是當(dāng)應(yīng)用程序的窗口需要重畫的時(shí)候觸發(fā)的,當(dāng)進(jìn)入處理該事件的句 柄內(nèi)部時(shí),代碼編輯器的窗口將推到前端。也就是說(shuō),此時(shí)窗口需要重畫了,這樣又將觸發(fā) OnPaint 事件。而一旦進(jìn)入處理 OnPaint 事件的句柄內(nèi)部,代碼編輯器的窗口又將被推到 前端。如此反復(fù),構(gòu)成無(wú)限循環(huán)。要解決上述問(wèn)題,必須把代碼編輯器與應(yīng)用程序的窗口在屏幕上重新排列,不要相互覆蓋。
程序往往大量調(diào)用了 VCL 的方法,一般情況下,不要跟蹤進(jìn)入VCL 的內(nèi)部,因?yàn)?VCL
的源代碼一般是不會(huì)出錯(cuò)的。如果懷疑 VCL 中可能出錯(cuò),或者想進(jìn)入 VCL 方法的內(nèi)部看 看方法是怎樣實(shí)現(xiàn)的,也可以進(jìn)入 VCL 方法的內(nèi)部。Delphi Enterprise 和 Delphi Professional 附帶了 VCL 的源代碼,而且還提供了帶調(diào)試信息的 VCL 庫(kù)。
為了節(jié)省時(shí)間和提高工作效率,不必每次都從頭開(kāi)始單步或跟蹤執(zhí)行程序,可以直接 跳到有疑問(wèn)的地方,然后再一行一行地執(zhí)行程序。
【Run】菜單中的【Run to Cursor】命令可以實(shí)現(xiàn)這個(gè)功能。它能夠先以非調(diào)試方式執(zhí) 行到光標(biāo)所在的行,再接管對(duì)程序的控制,單步或跟蹤執(zhí)行以后的代碼。
如果光標(biāo)所在的行不包含調(diào)試信息,調(diào)試器將彈出一個(gè)錯(cuò)誤框顯示“No ?code?wasgenerated for the current Line”。
如果不小心進(jìn)入了例程的內(nèi)部,想馬上退出來(lái),可以把光標(biāo)移到該例程的最后一行,使用【Run to Cursor】命令,再使用【Step Over】命令,就可以返回到調(diào)用該例程的地方。
3.4?? 全速執(zhí)行剩余的代碼
?
如果不小心進(jìn)入了一個(gè)例程,但又不想調(diào)試這個(gè)例程,或者確信該例程的代碼沒(méi)有問(wèn)題,從而想盡快退出這個(gè)例程,可以使用【Run】菜單中的【Run Until Return】命令。這個(gè)命令將全速執(zhí)行該例程的代碼,直到返回為止。
?
3.5?? 返回到執(zhí)行點(diǎn)
?
在調(diào)試過(guò)程中,隨時(shí)可以切換到 IDE 或其他程序中,進(jìn)行各種操作。如果要重新回到調(diào)試器的當(dāng)前執(zhí)行點(diǎn),可以使用【Run】菜單中的【Show ?Execution
Point】命令,光標(biāo)將自動(dòng)回到先前的執(zhí)行點(diǎn)上。 如果包含執(zhí)行點(diǎn)的源文件已關(guān)閉,調(diào)試器將重新打開(kāi)這個(gè)源文件。如果執(zhí)行點(diǎn)沒(méi)有對(duì)
應(yīng)的源代碼,Delphi 將打開(kāi) CPU窗口,顯示相應(yīng)的機(jī)器指令。
?
3.6?? 暫停運(yùn)行
?
使用【Run】菜單中的【Program Pause】命令將使程序運(yùn)行暫時(shí)停止,這樣就可以檢 查程序在此狀態(tài)下的輸出或變量的值是否正確,檢查完以后,可以繼續(xù)對(duì)程序進(jìn)行調(diào)試, 或者修改變量的值再讓程序繼續(xù)執(zhí)行,以便看程序?qū)π碌闹禃?huì)做出什么反應(yīng)。
有時(shí)候,程序暫停后無(wú)法回到調(diào)試器中繼續(xù)運(yùn)行,這時(shí)候可以同時(shí)按— 下
Ctrl+Alt+SysRq鍵終止程序的運(yùn)行,如果按一次無(wú)效,就多按幾次。
?
3.7?? 重新開(kāi)始運(yùn)行
在調(diào)試過(guò)程中,可以使用【Run】菜單中的【Program Reset】命令中止程序的運(yùn)行并釋 放所有占用的內(nèi)存和資源,關(guān)閉所有打開(kāi)的文件,清除所有的變量設(shè)置,然后重新運(yùn)行程 序。這通常用于在調(diào)試過(guò)程中發(fā)現(xiàn)了錯(cuò)誤并更改了源代碼后需要重新編譯和運(yùn)行的情況。
【Program Reset】命令并不刪除先前設(shè)置的斷點(diǎn)和觀察表達(dá)式,因?yàn)橹匦麻_(kāi)始調(diào)試程 序時(shí)可能還要用到這些設(shè)置。
【Program Reset】命令可能不能很“干凈”地釋放應(yīng)用程序占用的所有資源,這樣可 能導(dǎo)致其他程序運(yùn)行失敗,碰到這種情形應(yīng)當(dāng)退出 Delphi 或者重新啟動(dòng) Windows。
3.8?? 命令行參數(shù)
如果要調(diào)試的程序需要傳遞參數(shù),可以使用【Run】菜單中的【Parameters】命令打開(kāi)
【Run???? Parameters】對(duì)話框,如圖 7.4 所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ?圖 7.4? ?命令行參數(shù)
在【Parameters】框內(nèi)鍵入要傳遞的參數(shù),也可以從以前鍵入過(guò)的參數(shù)中選擇一個(gè)。
總結(jié)
以上是生活随笔為你收集整理的初级教程之---delphi调试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安装和使用VCLSkin美肤插件
- 下一篇: delphi初级教程之delphi断点调