掌握C++ builder的除錯(cuò)藝術(shù)(2).2
2019-09-06 23:33:48
供稿:網(wǎng)友
掌握c++builder的除錯(cuò)藝術(shù)
第二篇-近距離觀察(2)
使用evaluate/modify(求值/修改)
最后一種顯示變量或代碼塊的值的途徑是evaluate/modify(求值/修改)窗口。這個(gè)窗口可以象打開巡視器一樣打開,在您要evaluate/modify(求值/修改)的代碼行上右擊選擇"debug|evaluate/modify"就會(huì)彈出evaluate/modify(求值/修改)窗口。本窗口用來對(duì)表達(dá)式/變量求值并/或修改。watches和/或inspectors也可以實(shí)現(xiàn)同樣的功能。但如果您想要修改的話,這里恐怕是最好的地方。
“察看變量已經(jīng)聽夠了,現(xiàn)在我想去看看我的代碼到底怎么了,而不是干坐在這里。”我聽見您如是說。下一節(jié)我們將在函數(shù)體內(nèi)外單步跟蹤直至斷點(diǎn)(還記得前面的東西么?)。
在代碼塊內(nèi)外進(jìn)行stepping(單步執(zhí)行/跟蹤)
在此有一件事要牢記,前面講的絕大多數(shù)察看變量的辦法是動(dòng)態(tài)更新的。所以當(dāng)您跟蹤至新的一行的時(shí)候,變量的值會(huì)被自動(dòng)重新求值,并且顯示在窗口中的值被更新成新的當(dāng)前值。
okay,當(dāng)您點(diǎn)擊您所設(shè)置的斷點(diǎn)時(shí),您會(huì)看到您所需檢查的變量。下一步就是在代碼中單步執(zhí)行并且近距離觀察實(shí)際發(fā)生的與您所猜測(cè)的是否一致(通過使用watches/inspectors并跟隨代碼的執(zhí)行路徑前進(jìn))。
stepping的類型
這部分解釋起來似乎很簡(jiǎn)單。但下面的大部分都是來討論您用這些能做什么(好像在別處沒有聽到過?)。您可以告訴調(diào)試器五種"stepping types"(單步執(zhí)行類型)。我們會(huì)按run菜單上的順序來解釋。我同時(shí)會(huì)給出它們的快捷鍵。在調(diào)試時(shí)使用快捷鍵的次數(shù)會(huì)多過使用菜單選項(xiàng)的(比較按10次鍵盤與選10次菜單,我想您知道什么更好)。
第一種是"step over"(在函數(shù)體外單步執(zhí)行)或者f8。這會(huì)讓調(diào)試器執(zhí)行代碼至當(dāng)前函數(shù)的下一行可見的代碼停下,或者當(dāng)運(yùn)行至當(dāng)前函數(shù)的最后一行時(shí),調(diào)試器返回至調(diào)用函數(shù)停下。在您知道所調(diào)用的函數(shù)沒有問題時(shí),stepping over功能很方便。
下一個(gè)是"trace into"(跟蹤至函數(shù)體內(nèi))或f7。如果運(yùn)行的當(dāng)前行是調(diào)用一個(gè)函數(shù),調(diào)試器將把我們帶到調(diào)用的函數(shù)的第一行(即使是隱含調(diào)用函數(shù),例如一個(gè)write屬性)。否則執(zhí)行至當(dāng)前行的下一行。當(dāng)您想看看這個(gè)函數(shù)到底做些什么時(shí),這個(gè)功能非常方便。
接下來是"trace to next source line"(跟蹤至下一個(gè)源代碼行)或shift-f7。調(diào)試器會(huì)運(yùn)行至下一個(gè)具有調(diào)試信息的代碼行。這與"trace into"的區(qū)別,讓我們舉例來說明吧。當(dāng)我們調(diào)用一個(gè)沒有源代碼的windows api函數(shù)并且這個(gè)api函數(shù)調(diào)用了我們代碼中的一個(gè)回調(diào)函數(shù)。"trace to next source line"將在回調(diào)函數(shù)的第一行停下來,而"trace into"會(huì)忽略這個(gè)回調(diào)函數(shù)并在當(dāng)前程序的下一行停下來。
然后是"run to cursor"(運(yùn)行至光標(biāo)處)或f4。調(diào)試器將運(yùn)行代碼直至光標(biāo)所在的行。這使得不需設(shè)置斷點(diǎn)又可以跳過大片代碼變得很方便(考慮只需停頓一次的情況)。
還有"run until return"(運(yùn)行至返回)或shift-f8。調(diào)試器將運(yùn)行代碼直至當(dāng)前函數(shù)返回調(diào)用他的函數(shù)。當(dāng)您不想手工單步執(zhí)行至函數(shù)結(jié)束(假如您陷入一個(gè)循環(huán)中的話,這個(gè)過程會(huì)變的十分冗長(zhǎng))時(shí),這么做就會(huì)很方便的跳到函數(shù)的結(jié)尾處。
最后一個(gè)是"program reset"(程序重置)或ctrl-f2。調(diào)試器會(huì)中斷已運(yùn)行的程序并返回至調(diào)試器。除非迫不得已不要這么做,因?yàn)閷?duì)象所使用的資源沒有被釋放!!!(在一個(gè)數(shù)據(jù)庫應(yīng)用程序中,這樣做2-3次后,您將不得不關(guān)閉并重啟ide,因?yàn)閎de內(nèi)部資源將耗盡。您已經(jīng)被警告啦)。當(dāng)您不得不中止可執(zhí)行程序時(shí),這非常有用。
最后(卻在菜單很上面的位置)是"run"(運(yùn)行)或f9。調(diào)試器將運(yùn)行至程序結(jié)束,除非碰到您點(diǎn)擊新的斷點(diǎn)或發(fā)生異常。
stepping的注解
要牢記的是所有這些單步執(zhí)行方式在調(diào)試器通過斷點(diǎn)時(shí),調(diào)試器會(huì)對(duì)斷點(diǎn)求值,若斷點(diǎn)需要就停下。如果出現(xiàn)異常,調(diào)試器也會(huì)停下。
正如您所見,在正確的地方設(shè)置斷點(diǎn),察看變量并在代碼中單步跟蹤,我們能夠以非常近的距離觀察程序在做什么就好象它真的運(yùn)行一樣。這些功能在追查最困難的bugs---邏輯bug時(shí),相當(dāng)方便。
其他提示
如果您真的很勇猛并有匯編語言的經(jīng)驗(yàn),您可以點(diǎn)擊"view|debug windows|cpu"打開一個(gè)"cpu view"cpu窗口。這里不僅顯示了當(dāng)前可執(zhí)行程序的指令的匯編指令,還有象cpu標(biāo)志、寄存器的內(nèi)容和不斷更新的內(nèi)存印象
使用call stack ("view|debug windows|call stack")可以很方便的找出發(fā)生異常之前或遇到斷點(diǎn)之前的函數(shù)調(diào)用歷史。記住,這里只是顯示什么函數(shù)被什么函數(shù)調(diào)用過,并非真正的調(diào)用過程的歷史記錄。因此,這個(gè)窗口可能先會(huì)讓您感到困惑。但是只要開著它來stepping through單步跟蹤代碼至函數(shù)體內(nèi),好好觀察一下您就會(huì)完全明白了。
c++builder4、5中,watch, local variable, 和 call stack窗口可以駐留在code主窗口中,使用起來更加方便。c++builder5中還可以設(shè)定調(diào)試布局,以便在調(diào)試時(shí)使用(針對(duì)您在設(shè)計(jì)時(shí)使用的設(shè)計(jì)布局來講的)。
使用所有我所公布的所有技術(shù)再加上一點(diǎn)點(diǎn)耐心和一雙火眼金睛,您應(yīng)該可以解決99%的bug。若您想找到bug,耐心是必要的。花點(diǎn)時(shí)間,深呼吸一下,不要讓挫折嚇倒。如果有必要,走出去5分鐘干點(diǎn)別的,您會(huì)驚奇的發(fā)現(xiàn)自己有了新的視野或者發(fā)現(xiàn)開始時(shí)漏掉了什么步驟。
如果您有其他的技巧和提示覺得應(yīng)該加入此文,請(qǐng)盡管來信告訴我們,我們會(huì)在以后的版本中加入您的意見。
好了,我希望這篇文章在某種程度上有助于耐心的讀者們。如果正是這樣,我會(huì)十分高興自己干了件不錯(cuò)的工作。也許您所有的bugs都已微不足道了。
原著:bill king
翻譯:史平洋 - cker
版權(quán)說明:
國內(nèi)的網(wǎng)站上,有許多關(guān)于c++builder的內(nèi)容,但多以軟件、組件為主。論壇里也大都不能令人滿意,很空虛的感覺。書籍又都昂貴,內(nèi)容卻有搶錢之嫌。對(duì)銀子不足的初學(xué)者、自學(xué)者關(guān)愛不夠,因而想盡自己的綿薄之力。
文中的所有資料都是從國外網(wǎng)站上收集而來。因?yàn)閑文不方便,所以翻成中文。因?yàn)閑nglish和計(jì)算機(jī)都不是非常好,文中的錯(cuò)誤在所難免。若大家覺得有用的話,我計(jì)劃不斷搜集翻譯一些有用的東西。
有任何意見和建議請(qǐng)mailto:cker@sina.com
您可以隨意復(fù)制、分發(fā)、下載此文檔。但未經(jīng)本人同意,您不可以截取、改動(dòng)本文片斷,或用本文謀取任何形式的利益。