550 likes | 655 Views
F 使用偵錯程式. 學生:劉家吟 學號: 601630121 授課老師:魏世杰 老師 報告日期: 2013 年 12 月 24 日. 目錄. F.1 簡介 F.2 中斷點和 run 、 stop 、 cont 、 print 命令 F.3 print 和 set 命令
E N D
F 使用偵錯程式 學生:劉家吟 學號:601630121 授課老師:魏世杰 老師 報告日期:2013年12月24日
目錄 F.1 簡介 F.2 中斷點和run、stop、cont、print命令 F.3print和set命令 F.4 使用step、step up、next命令,控制程式的執行 F.5 watch命令 F.6clear命令 F.7 總結
F.1簡介 (1/2) 在第2章,學到的錯誤有兩種─語法錯誤和邏輯錯誤─也學到如何從程式碼排除語法錯誤。 邏輯錯誤並不會讓程式無法編譯,可是在執行時會讓應用程式產生錯誤的結果。 JDK包含了稱為偵錯器(debugger)的軟體,讓你可以觀察程式的執行,藉以找到邏輯錯誤並予以排除。 許多IDE(Integrated Development Environment)都有提供自己的偵錯器,有些類似於JDK內附的偵錯器,有些則是提供JDK偵錯器的圖形使用者介面。
F.1簡介 (2/2) • 這篇附錄使用不會從使用者處讀入任何輸入的命令列應用程式,來示範JDK偵錯器的主要功能,此處所討論偵錯器功能,同樣也可以用來偵錯會取用使用者輸入的應用程式,但偵錯這類應用程式,需要比較複雜的一些設定。 • 為了將重點放在偵錯器的功能上,此篇附錄選擇使用不會向使用者取得輸入的簡單命令列應用程式來示範偵錯程式。
F.2 中斷點和run、stop、cont、print命令 (1/12) • 中斷點 (breakpoint) • 中斷點是一種標記,可以設定在任一行程式碼上。 • 應用程式執行到中斷點時會暫停,讓你可以檢查變數的值,以助於判斷是否有邏輯錯誤。 • 例如,你可以檢查儲存計算結果的變數值,以判斷計算是否有正確執行,在不能執行的程式碼行(例如註解)上頭設定中斷點,會造成偵錯器顯示錯誤訊息。
F.2 中斷點和run、stop、cont、print命令(3/12) • 在以下步驟中,會使用中斷點和各種偵錯器命令來檢驗宣告於AccountTest的變數depositAmount的值。 • (1)開啟命令提示字元視窗,然後切換目錄。 • 選擇開始 > 程式 > 附屬應用程式 > 命令提示字元來開啟命令提示字元視窗。 • 鍵入 cd C :\examples\debugger,將目錄切換至包含附錄F範例的目錄。 • [請注意:如果你的範例位於不同的目錄,請使用該目錄]
F.2 中斷點和run、stop、cont、print命令(4/12) • (2)編譯偵錯用的應用程式。 • Java偵錯器只能夠處理用-g 選項編譯的.class檔,此選項產生的資訊,會被偵錯器用來協助你偵錯應用程式。 • 鍵入 javac -g AccountTest.javaAccount.java,以使用-g命令列選項編譯應用程式。 • 這個命令會同時編譯AccountTest.java跟Account.java。 • 命令java –g * .java會編譯所有目前目錄的.java檔案供偵錯使用。
F.2 中斷點和run、stop、cont、print命令(5/12) • (3)啟動偵錯器 • 在命令提示字元中,鍵入jdb(圖 F.2) • 此命令會啟動Java偵錯器,讓你可以使用其功能
F.2 中斷點和run、stop、cont、print命令(6/12) • (4)在偵錯器中執行應用程式 • 鍵入 run AccountTest(圖 F.3),以透過偵錯器執行AccountTest應用程式。 • 如果在偵錯器執行你的應用程式之前,你沒有設定任何中斷點,這支程式的執行就會跟使用java命令時一樣。
F.2 中斷點和run、stop、cont、print命令(7/12) • (5)重新啟動偵錯器 • 要妥善使用偵錯器,在執行應用程式之前,至少得設定一個中斷點。 • 鍵入 jdb重新啟動偵錯器。
F.2 中斷點和run、stop、cont、print命令(8/12) • (6)在Java中插入中斷點 • 在應用程式的特定一行設定中斷點 • 這些步驟的使用行號,來自於圖F.1的原始碼 • 鍵入 stop at AccountTest:12,以在原始碼的第12行設定中斷點 (圖F.4) • Stop 命令會在命令後頭指定的行號上,插入一個中斷點 • 在應用程式執行時,會暫停在任何包含中斷點的程式碼行 • 當偵錯器暫停應用程式的執行時,會說這支應用程式處於中斷模式 (break mode) • 偵錯器命令 stop in ,後頭加上類別名稱、點號跟方法名稱 (例如 stop in Account.credit) 會指示偵錯器將中斷點設定在指定方法的第一行可執行敘述上
F.2 中斷點和run、stop、cont、print命令(9/12) • (7)執行應用程式,開始偵錯程序 • 輸入 run AccountTest以執行應用程式,然後開始偵錯程序(圖 F.5) • 偵錯器會印出文字,指出中斷點設定在第12跟19行 • 它把每個中斷點都叫做「deferred breakpoint(延遲中斷點)」,因為每個中斷點都是在應用程式開始於偵錯器中執行之前設定的 • 當執行到第12行的中斷點時,應用程式便會暫停 • 此時偵錯器會通知你,已遇到中斷點,然後顯示位於該行(第12行)的原始碼,該行程式碼便是下一則要執行的敘述
F.2 中斷點和run、stop、cont、print命令(10/12) • (8)使用 cont 命令來回復執行 • 鍵入cont • cont命令會讓程式繼續執行,直到遇到下個中斷點為止(第19行),此時偵錯器會通知你(圖 F.6) • AccountTest的正常輸出會出現在偵錯器的訊息之間
F.2 中斷點和run、stop、cont、print命令(11/12) • (9)檢視變數的值 • 輸入 print depositAmount,以顯示目前儲存在 depositAmount變數中的數值( 圖F.7) • print 命令可以讓你窺看電腦內部其中一個你的變數的值 • 這則命令可以幫助找到程式碼的邏輯錯誤並予以排除 • 所顯示的數值是25.0 ─ 圖F.1第15行指定給depositAmount的數值
F.2 中斷點和run、stop、cont、print命令(12/12) • (10)繼續執行應用程式 • 輸入 cont,繼續執行應用程式 • 沒有更多中斷點了,所以應用程式不會再進入中斷模式 • 應用程式會繼續執行,最後結束 (圖 F.8) • 偵錯器會在應用程式結束時停止
F.3print和set命令(1/5) • (1)開始偵錯 • 在命令提示字元中,輸入 jdb,啟動Java偵錯器 • (2)插入中斷點 • 輸入 stop at AccountTest:19,以在原始碼的第19行設定中斷點
F.3print和set命令(2/5) • (3)執行應用程式抵達中斷點 • 輸入 run AccountTest,開始偵錯程序 (圖 F.9) • 這會讓AccountTest 的 main 開始執行,直到第19行的中斷點為止 • 應用程式會暫停執行,切換至中斷模式
F.3print和set命令(3/5) 若鍵入 print depositAmount ==23.0,傳回數值為false, 因為depositAmount目前包含的數值並非23.0─ depositAmount仍然是25.0。 • (4)計算算術和布林運算式的值 • 一旦應用程式進入中斷模式,便可以使用偵錯器的print命令,觀看應用程式變數的值 • 也可以使用print 命令,來計算算數和布林運算式的值 • 在命令提示字元視窗中,鍵入 print depositAmount -2.0,這則print 命令會傳回數值 23.0(圖 F.10) → 這則命令並不會實際改變depositAmount的數值
F.3print和set命令(4/5) • (5)修改數值 • 偵錯器可以在應用程式執行時,修改變數的值 • 可以實驗不同的數值,找出應用程式的邏輯錯誤 • 使用偵錯器的 set 命令來修改變數的值 • 鍵入 set depositAmount = 75.0,偵錯器會改變depositAmount的數值,然後顯示其新值
F.3print和set命令(5/5) • (6)觀察應用程式執行結果 • 輸入 cont,繼續執行應用程式 • AccountTest (圖 F.1) 的第19行會執行,把depositAmount 傳入Account的 credit方法 • 接著 main 方法會顯示新的餘額,結果會是 $125.00(圖 F.12) • 這樣做會顯示出前一步將 depositAmount的數值,從初始值 (25.0) 修改為 75.0
F.4 使用step、step up、next命令,控制程式的執行(1/9) • 有時候你會需要逐步執行應用程式,以找出錯誤並加以修正。 • 這樣逐步執行程式的某個部分,可以幫助你檢驗某個方法的程式碼是否執行正確。 • 在本節所學到的指令,讓你可以逐步執行方法、一次執行某個方法的所有敘述、或是只執行方法剩餘的敘述 ( 如果你已經執行過方法中的某些敘述 )。 • 假設你正在包含附錄F範例的目錄中工作,而且已經使用過-g編譯器選項進行編譯以供偵錯。
F.4 使用step、step up、next命令,控制程式的執行(2/9) • (1)啟動偵錯器 • 鍵入 jdb,啟動偵錯器 • (2) 設定中斷點 • 鍵入 stop at AccountTest:19,在第19行設定中斷點 • (2) 執行應用程式 • 鍵入 run AccountTest,執行應用程式 • 在應用程式顯示其兩個輸出訊息後,偵錯器會指出抵達中斷點,然後顯示位於第19行的程式碼 (圖 F.13) • 接著偵錯器與應用程式會暫停並等待輸入下一則命令
F.4 使用step、step up、next命令,控制程式的執行(3/9) • (4)使用 step命令 • step命令會執行應用程式的下一則敘述 • 如果下一則要執行的敘述是方法呼叫,控制權便會轉移到被呼叫的方法 • step 命令讓你可以進入某個方法,研究此方法的各則敘述
F.4 使用step、step up、next命令,控制程式的執行(4/9) • (5)使用 step up 命令 • 在進入 credit方法後,輸入 step up • 這則命令會執行方法中剩餘的敘述,然後將控制權傳回給呼叫此方法的所在
F.4 使用step、step up、next命令,控制程式的執行(5/9) • (6)使用 cont 命令繼續執行 • 輸入 cont命令繼續執行 (圖 F.16) • 位於第 22-23行的敘述會執行,顯示新的餘額,然後應用程式跟偵錯器都會終止
F.4 使用step、step up、next命令,控制程式的執行(6/9) • (7)重新啟動偵錯器 • 鍵入 jdb,重新啟動偵錯器 • (8)設定中斷點 • 中斷點會一直存在,直到設定它們的偵錯會談結束為止─ ─ 一旦離開偵錯器,所有的中斷點都會移除 • 因此,在步驟 7 重新啟動偵錯器時,步驟 2 所設定的,位於 第19行的中斷點便不再存在 • 要在第 19行重新設定中斷點,必須再次鍵入 stop at AccountTest:19
F.4 使用step、step up、next命令,控制程式的執行(7/9) • (9)執行應用程式 • 輸入 run AccountTest,執行應用程式 • 如同步驟 3,AccountTest 會執行,直到第 19行的中斷點為止 • 然後偵錯器會暫停,等待下一個命令 (圖 F.17)
F.4 使用step、step up、next命令,控制程式的執行(8/9) • (10)使用 next 命令 • 鍵入 next • 這則命令的行為跟 step 命令一樣,除了下一則要執行的敘述,包含方法呼叫之外 • 在此狀況下,被呼叫的方法會整個執行完畢,然後應用程式會前進到方法呼叫之後的下一行可執行程式碼 (圖 F.18)
F.4 使用step、step up、next命令,控制程式的執行(9/9) • (11)使用 exit 命令 • 使用 exit 命令來結束偵錯會談 (圖 F.19) • 此命令會造成 AccountTest應用程式立即終止,而非執行 main 中剩餘的敘述 • 在偵錯某些種類的應用程式時 ( 例如 GUI 應用程式),即使偵錯會談結束,應用程式還是會繼續執行
F.5 watch命令 • 此命令會告訴偵錯器監看某個欄位,當此欄位將要改變時,偵錯器會通知你。 • (1)啟動偵錯器 • 鍵入 jdb,啟動偵錯器 • (2)監看類別的欄位 • 鍵入 watch Account.balance,對於 Account 的 balance 欄位設定監看 (圖 F.20) • 可以在偵錯器執行時,對任何欄位設定監看
F.5 watch命令 • (3)執行應用程式 • 使用 run AccountTest 命令來執行應用程式
F.5 watch命令 • (4)增添金額至帳戶 • 鍵入 cont,繼續執行應用程式 • 在抵達圖 F.1 第 19行的程式碼前,這支應用程式會正常執行,此行會呼叫 Account 的 credit方法,將 Account 物件的 balance加上指定的 amount
F.5 watch命令 • (5)繼續執行 • 鍵入 cont─ ─ 應用程式會執行到完,因為此應用程式不會再試圖改變 balance (圖 F.23)
F.5 watch命令 • (6)重新啟動偵錯器,對於變數重新設監看點 • 輸入 jdb,重新啟動偵錯器 • 再次鍵入 watch Account.balance,對於Account 的實體變數 balance設定監看點 • 然後鍵入 run AccountTest以執行應用程式 (圖 F.24)
F.5 watch命令 • (7)移除欄位的監看點,假設你只想在某部分程式執行時, 監視某個欄位 • 可以輸入 unwatchAccount.balance,移除對於 balance 變數的監看 (圖 F.25) • 鍵入 cont,應用程式會執行到完,不再進入中斷模式
F.6clear命令(1/10) 在前一章,學到如何使用 unwatch命令,移除對於欄位的監看。 偵錯器也提供 clear命令,從應用程式移除中斷點。 通常會需要偵錯包含反覆行為的應用程式,例如迴圈。 可能會想要在迴圈的某幾次循環時檢驗變數的數值,但並非全部。 如果在迴圈主體設定中斷點,偵錯器便會在包含中斷點的每行執行之前暫停。 在判斷迴圈正常運作後,可能會想要移除中斷點,讓剩下的迴圈能正常進行。
F.6clear命令(3/10) • (1)開啟命令提示字元視窗,切換目錄並編譯應用程式以供 偵錯 • 此目錄提供 Interest.java檔案的副本 • 鍵入 javac –g Interest.java編譯此應用程式以供偵錯
F.6clear命令(4/10) • (2)啟動偵錯器並設定中斷點 • 鍵入 jdb,啟動偵錯器 • 輸入 stop at Interest:13 • 然後輸入 stop at Interest:22,在Interest 類別的第13跟22行設定中斷點 (圖 F.26)
F.6clear命令(5/10) • (3)執行應用程式 • 鍵入 run Interest 執行應用程式 • 應用程式會一直執行到第 13行的中斷點 (圖 F.27)
F.6clear命令(6/10) • (4)繼續執行 • 鍵入 cont繼續執行─應用程式會執行第 13行,印出欄標題”Year”跟”Amount on deposit”
F.6clear命令(7/10) • (5)檢驗變數值 • 輸入 print year 來檢視目前變數 year的數值(即 for 的控制變數) • 也印出變數 amount的數值 (圖 F.29)
F.6clear命令(8/10) • (6)繼續執行 • 鍵入 cont 以繼續執行 • 第 22 行會執行,然後印出 year 跟 amount目前的數值 • 在 for 進入其第二輪循環時,偵錯器會通知你第二次抵達第 22行的中斷點