亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

掌握C++ builder的除錯藝術(2).1

2019-09-06 23:33:48
字體:
來源:轉載
供稿:網友

                    掌握C++Builder的除錯藝術

第二篇-近距離觀察(1)

1./t調試可執行程序前的準備

2./t工程選項

3./t設置斷點并闖入可執行程序

4./t察看儲存在變量中的值

5./t使用Watches(觀察)

6./t使用Inspectors(巡視器)

7./t使用Evaluate/Modify(求值/修改)

8./tStepping Through, Over and Around Blocks of Code

9./tStepping的類型

10.   Stepping的注解

11.   其他提示

Okay,(再小小準備一下)現在開始追蹤、搜索經過前次的努力后仍然躲在代碼中的bug的時候了,也就是開始跟蹤前一篇文章代碼里標記過的bug/異常。首先是準備階段。

調試可執行程序前的準備

在我們開始調試可執行程序前,我們需要確保一些設置在大多數情況下的正確性。我將會一條接一條的過一遍,并簡單解釋一下為什么必須那樣做。(如果您對有些東西感興趣的話,按下幫助按鈕,會有許多更詳盡的內容)?,F在就開始吧,先打開Project|Options選項。

工程選項

首先我們在"Compiler"(編譯)標簽處停下。您只需簡單的單擊"Full debug"(完全調試模式)按鈕,我們所需的絕大多數的其余設置就已經搞定了。將"Code optimization"(代碼優化)設為"None"(無)總是件好事,這樣做實際上告訴編譯器:所有的事情都已做好,只需產生機器碼就行了。而不要為了提高一點點運行速度嘗試進行其他的智能優化。(當然,一切都完成之后,您可以打開此項。)這樣做的好處是大大降低了我們調試的難度。因為程序中的代碼與我們書寫的一樣,沒有被編譯器優化過。在"debugging"(調試)面板中,將"Debug information"(調試信息)選上(點一下),并且必須設置為"Line number information"(行數信息)。我還建議將"Disable inline expansions"(禁用內聯擴展)一項選上。內聯擴展對發布的代碼來說很好,但調試時最好還是關掉此項,他只會讓您更頭痛。

然后是"Pascal"標簽,尤其在您的工程里連接了Pascal單元或使用了基于Pascal的VCL控件時(若您擁有其Pascal源碼時,編譯器會自動使用此節中的設置重新編譯)。這里您必須將"Optimization"優化選項禁用,然后通常我會將"debugging"(調試)部分的所有選項選上(打鉤)。

接下來是"Linker"(鏈接)標簽,我們需要選上"Create debug information"(生成調試信息)。"Use dynamic RTL"(使用動態RTL)以及"Don’t generate state files"(不要生成狀態文件)是造成麻煩的選項。我通常都會使用狀態文件(這樣允許增量鏈接,但會在編譯目錄下產生一個4倍于可執行程序或更大的文件),換個角度來說,這樣會增加鏈接大工程時的速度。而使用dynamic RTL本身就是個爭論,尚有很多贊同和反對的討論。

下一個是"Directories/Conditionals"(路徑/條件)標簽。在這里我們想要設定"Directories/Conditionals"(調試源路徑)的值。我們永遠都應將此處設定為$(BCB)sourcevcl,但是如果您有任何其他的組件附加的話,通常將它們的路徑也加上是個好主意(路徑與路徑之間用”;”分隔或者您可以用按下…按鈕彈出的對話框來設定它們)。

最后也是最重要的設置是在"Packages"(程序包)標簽上。根據所有恰如其分的調試經驗您必須禁用"Build with runtime packages"(帶運行時程序包編譯)。這么做的原因是程序包本身不包含而且不能包含調試信息。這樣做,也許不利于您跟蹤標準的VCL代碼,例如想看清楚VCL函數y中參數x是如何起作用的時候。但是大多數時候,您這么做將會發現調試器將您的絕大多數“癥狀”歸結給VCL,盡管“病因”就在您的源代碼中(或在其他的組件中(這已經在我們所有人身上發生了))。一旦您發布您的正式版本時,您可以決定是否使用程序包。(譯者注:程序包的本質是一個特殊的DLL,不帶運行程序包(靜態)編譯可以讓您的程序脫離Cbuilder獨立運行。),但在調試時,請禁用掉。按下OK按鈕,我們已經準備好啦。下一個對話框只需打開一次,但最好還是來檢查以下我們在這里的設定是否正確。好了,打開”Tools|Debugger Options…”吧。

對話框最下方的"Integrated debugging"(集成調試器)選項是關鍵所在。確信已經打上鉤。按下OK按鈕準備編譯可執行程序吧。我建議重新來一次徹底的編譯(選擇Project|Build All),如果您修改過您的設置的話(尤其是改變”building with packages”方式后)。這將保證我們的所有程序單元按照我們所希望的那樣被編譯。

設置斷點并闖入可執行程序

象您所見過的其他任何一款調試器一樣,C++Builder提供強大的斷點設置功能?;旧?,斷點是指代碼中的一個點,程序執行至此停下(與退出不同,這只是執行中的暫停)并將控制權交還給調試器。設置一個斷點相當容易。只需在您想要設置的程序代碼行左側的灰色槽形區域點擊,您會看到一個紅點出現,這一行也會變紅。程序運行到這一點就會暫停,將控制權交還給調試器。

您也許會問如果我不想每次都停下來呢?當然可以,而且還很容易做到,這取決于您暫停程序的標準是什么?(譯者注:條件斷點)。在剛才那個斷點(紅點)上右擊鼠標并從彈出菜單上選擇” Breakpoint Properties”(斷點屬性)。此處可以設定兩種屬性"Condition"(條件)和"Pass Count"(通過次數)。Condition(條件)屬性太方便了。您可以利用if()語句輸入幾乎是任意的條件。但請牢記條件中的所有變量,對此斷點都應是可見的。條件屬性并未被編譯器編譯到執行程序中,而是在運行時,當程序運行至斷點暫停后,檢查斷點的條件是否滿足。條件為真,停下,否則讓程序繼續運行。另一個屬性"Pass Count"(通過次數)也很容易理解。斷點將被通過Pass Count次后停下。結合使用這兩個屬性,在調試您的代碼時,您可以設定非常嚴格的斷點。

還有一件要牢記的是,當您在調試器中發生異常時,會以產生異常處的那一行代碼上的斷點的形式出現。這種情況很容易制造。一旦您得到一個異常后應做的步驟我會在以后展示如何在堆棧中回溯并跟蹤找出異常發生的真正原因(如引起異常產生的那一小片代碼)。

另一個要牢記的提示是當您運行您的程序時,代碼窗口左側有藍點的任意一行都可以設成斷點。所有非法的斷點將會變為紅點中帶一個黃色的小叉,這一行代碼也會變成黃褐色。合法的斷點則變為紅點中帶一個綠色的小鉤。運行時,您可以設置/修改任意一點,斷點立即生效而無須重新編譯。

察看儲存在變量中的值

一旦您的程序在您的斷點處停下后,該做什么?有一件事您想做而且必須做的,那就是察看儲存在您程序中的各種變量真實的值。這部分內容涉及的方面很多,您一定要堅持,忍受這些枯燥的東西。幸運的是當您看完這些,您一定會對調試器這部分最強大的功能有些新的理解。有許多種方法可以察看變量的值,主要要根據您的目的來決定。我會從察看當前函數的Local Variables(局部變量)開始把他們都講完。

察看局部變量沒有太多可以講的。只需點擊”View|Debug Windows|Local Variables”,或按下ctrl-alt-L將會彈出一個窗口,顯示了當前函數的局部變量。窗口中的變量將會隨您單步向下執行或回溯的函數體的更新而更新。

使用Watches(觀察)

下一步您可以通過設定一個variable watch(變量觀察)來察看程序中的變量。就象它的名稱所表達的,觀察一個變量并將其值顯示在變量觀察窗口中(點擊"View|Debug Windows|Watches"或按下 ctrl-alt-W)。您可以通過兩個途徑來添加一個觀察,第一種是在代碼窗口中高亮選擇您要觀察的變量或表達式(是的!它可以理解并對絕大多數簡單表達式求值,比如(i*j)+05 或者 SomeVector.Name)并右擊鼠標,選擇"Debug|Add Watch at Cursor"或按下ctrl-f5,就會加入觀察窗口。如果必要,同時會打開觀察窗口

您還可以通過在觀察窗口的空白處雙擊來添加。這時會彈出添加watch對話框,"Expression"(表達式)域的意思無須多說,但另幾個域我想解釋一下,它們也同樣方便。

"Repeat count"(重復值)用于您觀察一個已知長度的數組變量(比如一個blah[50]數組)。您要將Expression(表達式)設為數組的名字(本例中是blah)。"Repeat count"設為數組的元素數量(本例中是50)。然后就會顯示數組的每個元素(如:blah[0], blah[1], blah[2]…)。

"Digits"(小數位數)用來設定顯示十進制浮點數的小數位數的。下面的點選集合是用來強制設定變量的顯示類型的(將無符號長整數顯示為十六進制格式)。還有一點要特別說明的是,如果您在watch窗口中用鼠標右擊一個watch后的彈出菜單上會出現"Break When Changed"的選項,這將在變量上設定一個斷點,在此變量發生變化時會暫停程序。

使用Inspectors(巡視器)

巡視變量是察看變量中的數據的第三種辦法。也幾乎是觀察完整的類的數據的最佳方法。可以有兩種方法來巡視一個變量。第一種是在local variable window(局部變量窗口)中,雙擊一個變量,將會彈出"Debug Inspector"(調試巡視器)窗口,里面顯示了這個變量所有的"Data" (variables) (數據(變量))、"Methods" (functions)(方法(函數))和"Properties"(屬性)。如果這是個簡單數據,將會顯示此變量的名稱及其中的值。(譯者注:如果是數組呢?真不錯?。?br/>
您會注意到,Debug Inspector(調試巡視器)很象property editor(屬性編輯器)。當然如此,更加重要的是,事實上您可以在運行時實時改變這些值!??!小心使用啦!改入壞值的結果會讓您有說不出來的悲痛。巡視器的這個能力可用來快速測試(假設的)游戲關卡(譯者注:好像FPE,GM),而不用有編譯-運行-修改-編譯-運行的循環。

(舉例巡視Form1)在properties(屬性)頁上,您將會看到某些屬性實際上并沒有顯示其的值,而是顯示了{read=,write=}。如果這些值可以被賦值的話,當您在此區域單擊后,您會注意到一個"?"按鈕出現在屬性的右側。單擊這個按鈕將會系統執行適當的函數來嘗試取回屬性的值。我們可以在這兒舉個例子-就舉Form1的MDIChildCount的屬性吧。在MDIChildCoun的屬性值區域上單擊,在按下"?"按鈕,哇,0(正是非-MDI的程序的指定值)。調試巡視器強大的能力并未到此為止。在巡視器的成員變量的適當區域雙擊可以打開成員變量的巡視窗口,提供與您開始打開窗口一樣的能力。

巡視器窗口的另一個有用的功能是從對象繼承的能力。這可以在通過在適當區域上右擊選擇"Descend"(繼承)來做到。繼承的結果是產生了一個新的變量。您會注意到頂部的下拉List box中的變量名稱已經換成新的變量名了。您可以直接在ListBox中切換巡視的變量。這使得在對象的不同部分快速切換變得非常簡單,而不會讓大大小小的巡視器窗口擾亂您的工作空間。

有一點要牢記的是,如果您離開函數,或者離開變量的作用范圍,調試巡視器會失去對變量的跟蹤。若您需要再次察看的話,請重新設置巡視器。但是您在當前函數的代碼中單步運行的話,巡視器會自動刷新。



版權說明:

國內的網站上,有許多關于C++Builder的內容,但多以軟件、組件為主。論壇里也大都不能令人滿意,很空虛的感覺。書籍又都昂貴,內容卻有搶錢之嫌。對銀子不足的初學者、自學者關愛不夠,因而想盡自己的綿薄之力。

文中的所有資料都是從國外網站上收集而來。因為E文不方便,所以翻成中文。因為English和計算機都不是非常好,文中的錯誤在所難免。若大家覺得有用的話,我計劃不斷搜集翻譯一些有用的東西。

有任何意見和建議請mailto:cker@sina.com

您可以隨意復制、分發、下載此文檔。但未經本人同意,您不可以截取、改動本文片斷,或用本文謀取任何形式的利益。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩中文在线制服| 欧美激情xxxx性bbbb| 亚洲精品v天堂中文字幕| 日韩av影视在线| 欧美成人sm免费视频| 欧美肥老太性生活视频| 国产午夜精品久久久| www.色综合| 国产99久久久欧美黑人| 国外视频精品毛片| 日本三级韩国三级久久| xxxxxxxxx欧美| 日韩中文在线不卡| 亚洲女人被黑人巨大进入al| 中文字幕av一区中文字幕天堂| 不用播放器成人网| 自拍偷拍亚洲在线| 成人福利在线视频| 国产不卡av在线免费观看| 午夜精品视频在线| 欧美日韩国产麻豆| 欧美在线www| 国产热re99久久6国产精品| 欧美大全免费观看电视剧大泉洋| 欧美成人亚洲成人日韩成人| 国内精久久久久久久久久人| 欧美日韩不卡合集视频| 8090成年在线看片午夜| 97超级碰在线看视频免费在线看| 成人免费在线视频网址| 亚洲a在线播放| 欧美专区中文字幕| 国产精品一区二区三区免费视频| 久久精品国产清自在天天线| 国语对白做受69| 亚洲的天堂在线中文字幕| 中文字幕日韩免费视频| 亚洲а∨天堂久久精品喷水| 亚洲高清在线观看| 国产精品中文字幕久久久| 欧美第一黄网免费网站| 欧美激情视频在线观看| 欧美日韩亚洲一区二| 精品偷拍各种wc美女嘘嘘| 激情成人中文字幕| 欧美日韩色婷婷| 精品亚洲va在线va天堂资源站| 日韩中文字幕第一页| 国产欧美一区二区三区四区| 亚洲一区二区三区在线视频| 欧美一级淫片丝袜脚交| 成人自拍性视频| 久久91精品国产| 亚洲男人第一网站| 国产精品女人网站| 深夜福利国产精品| 亚洲男人天堂2019| 黑人巨大精品欧美一区二区一视频| 久久久久久国产精品三级玉女聊斋| 欧美性生活大片免费观看网址| 久久视频在线直播| 亚洲成人免费在线视频| 亚洲国产精品字幕| 久久久久久国产精品美女| 亚洲国产一区二区三区在线观看| 国产精品电影网站| 亚洲一区第一页| 亚洲精品日韩欧美| 亚洲人成在线观看网站高清| 91禁外国网站| 日韩视频精品在线| 久久99国产精品自在自在app| 日韩福利在线播放| 国产日韩av在线播放| 91视频8mav| 乱亲女秽乱长久久久| 亚洲国产精品久久久久| 亚洲精品中文字幕av| 亚洲精品v欧美精品v日韩精品| 精品视频9999| 国产精品精品视频| 欧美激情免费视频| 欧美成人免费小视频| 欧美一级视频在线观看| 亚洲综合精品伊人久久| 国产精品一区二区电影| 日日狠狠久久偷偷四色综合免费| 中文字幕久热精品在线视频| 日本精品免费一区二区三区| 国产精品白嫩美女在线观看| 久久成人国产精品| 久久91亚洲人成电影网站| 久久人人爽人人| 96精品视频在线| 欧美日韩午夜视频在线观看| 亚洲国产日韩欧美在线动漫| 国产aaa精品| 久久99国产精品久久久久久久久| 亚洲网站视频福利| 国产精品久久久久久婷婷天堂| 亚洲成年人在线| 51精品国产黑色丝袜高跟鞋| 国产亚洲欧美日韩精品| 国产自产女人91一区在线观看| 久久综合国产精品台湾中文娱乐网| 97久久精品国产| 欧美日韩激情美女| 亚洲视频第一页| 97人洗澡人人免费公开视频碰碰碰| 欧美精品激情在线| 久久久免费观看| 亚洲国产一区二区三区在线观看| 国产精品小说在线| 欧美视频一区二区三区…| 北条麻妃一区二区三区中文字幕| 97精品伊人久久久大香线蕉| 欧美俄罗斯性视频| 久久视频免费在线播放| 久久精品中文字幕免费mv| 色综合91久久精品中文字幕| 欧美电影免费观看高清完整| 欧美一级黑人aaaaaaa做受| 中文字幕v亚洲ⅴv天堂| 色爱精品视频一区| 亚洲香蕉伊综合在人在线视看| 精品日本高清在线播放| 欧美猛男性生活免费| 久久精品99久久久香蕉| 91日韩在线视频| 午夜精品视频网站| 国产成人涩涩涩视频在线观看| 欧美体内谢she精2性欧美| 三级精品视频久久久久| 92裸体在线视频网站| 国产精品久久久久福利| 亚洲一区二区久久| 欧美一区二区三区免费观看| 日韩在线高清视频| 欧美电影院免费观看| 久久av中文字幕| 久久久久久久色| 欧美极品少妇与黑人| 亚洲欧美一区二区三区四区| 日韩专区在线播放| 精品视频在线播放免| 欧美理论片在线观看| 91精品国产综合久久久久久蜜臀| 久久久久国产一区二区三区| 久久久久亚洲精品| 亚洲免费精彩视频| 91精品国产综合久久香蕉的用户体验| 欧美精品在线免费播放| 日韩在线观看视频免费| 爽爽爽爽爽爽爽成人免费观看| 国产精品视频区1| 97视频在线观看免费高清完整版在线观看| 成人免费观看a| 亚洲精品久久久久| 日本欧美精品在线| 91精品成人久久| 欧美极品少妇与黑人| 97视频色精品| 国产精品中文字幕在线| 国产裸体写真av一区二区|