程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 掌握C++ builder的除錯藝術(2).2

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

編輯:關於C++

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

使用evaluate/modify(求值/修改)

最後一種顯示變量或代碼塊的值的途徑是evaluate/modify(求值/修改)窗口。這個窗口可以象打開巡視器一樣打開,在您要evaluate/modify(求值/修改)的代碼行上右擊選擇"debug|evaluate/modify"就會彈出evaluate/modify(求值/修改)窗口。本窗口用來對表達式/變量求值並/或修改。watches和/或inspectors也可以實現同樣的功能。但如果您想要修改的話,這裡恐怕是最好的地方。

“察看變量已經聽夠了,現在我想去看看我的代碼到底怎麼了,而不是干坐在這裡。”我聽見您如是說。下一節我們將在函數體內外單步跟蹤直至斷點(還記得前面的東西麼?)。

在代碼塊內外進行stepping(單步執行/跟蹤)

在此有一件事要牢記,前面講的絕大多數察看變量的辦法是動態更新的。所以當您跟蹤至新的一行的時候,變量的值會被自動重新求值,並且顯示在窗口中的值被更新成新的當前值。

okay,當您點擊您所設置的斷點時,您會看到您所需檢查的變量。下一步就是在代碼中單步執行並且近距離觀察實際發生的與您所猜測的是否一致(通過使用watches/inspectors並跟隨代碼的執行路徑前進)。

stepping的類型

這部分解釋起來似乎很簡單。但下面的大部分都是來討論您用這些能做什麼(好像在別處沒有聽到過?)。您可以告訴調試器五種"stepping types"(單步執行類型)。我們會按run菜單上的順序來解釋。我同時會給出它們的快捷鍵。在調試時使用快捷鍵的次數會多過使用菜單選項的(比較按10次鍵盤與選10次菜單,我想您知道什麼更好)。

第一種是"step over"(在函數體外單步執行)或者f8。這會讓調試器執行代碼至當前函數的下一行可見的代碼停下,或者當運行至當前函數的最後一行時,調試器返回至調用函數停下。在您知道所調用的函數沒有問題時,stepping over功能很方便。

下一個是"trace into"(跟蹤至函數體內)或f7。如果運行的當前行是調用一個函數,調試器將把我們帶到調用的函數的第一行(即使是隱含調用函數,例如一個write屬性)。否則執行至當前行的下一行。當您想看看這個函數到底做些什麼時,這個功能非常方便。

接下來是"trace to next source line"(跟蹤至下一個源代碼行)或shift-f7。調試器會運行至下一個具有調試信息的代碼行。這與"trace into"的區別,讓我們舉例來說明吧。當我們調用一個沒有源代碼的windows api函數並且這個api函數調用了我們代碼中的一個回調函數。"trace to next source line"將在回調函數的第一行停下來,而"trace into"會忽略這個回調函數並在當前程序的下一行停下來。

然後是"run to cursor"(運行至光標處)或f4。調試器將運行代碼直至光標所在的行。這使得不需設置斷點又可以跳過大片代碼變得很方便(考慮只需停頓一次的情況)。

還有"run until return"(運行至返回)或shift-f8。調試器將運行代碼直至當前函數返回調用他的函數。當您不想手工單步執行至函數結束(假如您陷入一個循環中的話,這個過程會變的十分冗長)時,這麼做就會很方便的跳到函數的結尾處。

最後一個是"program reset"(程序重置)或ctrl-f2。調試器會中斷已運行的程序並返回至調試器。除非迫不得已不要這麼做,因為對象所使用的資源沒有被釋放!!!(在一個數據庫應用程序中,這樣做2-3次後,您將不得不關閉並重啟ide,因為bde內部資源將耗盡。您已經被警告啦)。當您不得不中止可執行程序時,這非常有用。

最後(卻在菜單很上面的位置)是"run"(運行)或f9。調試器將運行至程序結束,除非碰到您點擊新的斷點或發生異常。

stepping的注解

要牢記的是所有這些單步執行方式在調試器通過斷點時,調試器會對斷點求值,若斷點需要就停下。如果出現異常,調試器也會停下。

正如您所見,在正確的地方設置斷點,察看變量並在代碼中單步跟蹤,我們能夠以非常近的距離觀察程序在做什麼就好象它真的運行一樣。這些功能在追查最困難的bugs---邏輯bug時,相當方便。

其他提示

如果您真的很勇猛並有匯編語言的經驗,您可以點擊"view|debug windows|cpu"打開一個"cpu view"cpu窗口。這裡不僅顯示了當前可執行程序的指令的匯編指令,還有象cpu標志、寄存器的內容和不斷更新的內存印象

使用call stack ("view|debug windows|call stack")可以很方便的找出發生異常之前或遇到斷點之前的函數調用歷史。記住,這裡只是顯示什麼函數被什麼函數調用過,並非真正的調用過程的歷史記錄。因此,這個窗口可能先會讓您感到困惑。但是只要開著它來stepping through單步跟蹤代碼至函數體內,好好觀察一下您就會完全明白了。

c++builder4、5中,watch, local variable, 和 call stack窗口可以駐留在code主窗口中,使用起來更加方便。c++builder5中還可以設定調試布局,以便在調試時使用(針對您在設計時使用的設計布局來講的)。

使用所有我所公布的所有技術再加上一點點耐心和一雙火眼金睛,您應該可以解決99%的bug。若您想找到bug,耐心是必要的。花點時間,深呼吸一下,不要讓挫折嚇倒。如果有必要,走出去5分鐘干點別的,您會驚奇的發現自己有了新的視野或者發現開始時漏掉了什麼步驟。

如果您有其他的技巧和提示覺得應該加入此文,請盡管來信告訴我們,我們會在以後的版本中加入您的意見。

好了,我希望這篇文章在某種程度上有助於耐心的讀者們。如果正是這樣,我會十分高興自己干了件不錯的工作。也許您所有的bugs都已微不足道了。

原著:bill king

翻譯:史平洋 - cker

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved