如何調試程序及調試程序基本步驟、方法詳解

1.爲什麼要進行程序調試及調試程序的目的?

程序調試是將編制的程序投入實際運行前,用手工或 編譯程序等方法進行測試,修正語法錯誤和邏輯錯誤的過程。這是保證計算機信息系統正確性的必不可少的步驟。

測試時程序運行錯誤,無法根據提示的錯誤信息準確定位錯誤原因及錯誤位置。

根據測試時所發現的錯誤信息和利用調試工具追蹤的提示信息,兩者相互結合綜合判斷錯誤發生原因和位置。找出錯誤原因具體的錯誤位置*,最終方便進行修正。

測試本身也就屬於程序調試的過程中的一部分。
調試是驗證程序的運行是否符合自己的設計。

2.調試的原則

​ 一、用頭腦去分析思考與錯誤徵兆有關的提示信息。

​ 二、避開死衚衕。同一個問題驗證完成,辦法行不通。這樣需要換種思路處理問題。

​ 三、只把調試工具當做查找錯誤位置及錯誤原因的手段。利用調試工具,理清楚程序中數據流轉邏輯,可以幫助思考,但不能代替思考,因爲調試工具只是輔助性的定位錯誤的方法。而解決實際問題需要根據調試的提示信息,自己判斷思考出正確的處理方式。

​ 四、避免用試探法,最多隻能把它當做最後手段。

​ 五、修改錯誤的一個常見失誤是隻修改了這個錯誤的徵兆或這個錯誤的表現,而沒有修改錯誤本身。如果提出的修改不能解釋與這個錯誤有關的全部線索,那就表明只修改了錯誤的一部分。要找到問題的根源。思考爲什麼會引起這樣的錯誤,是否是設計上就出現不合理的問題。

3.調試程序的思想

首先要了解清楚系統功能的業務,業務瞭解清楚後,根據業務功能進行測試來使業務數據流轉(業務產生數據,數據體現業務)。

當錯誤發生時,首先應該想到並且知道這個問題的產生所依賴的業務數據流程。

比如:當點擊表單提後出現錯誤。這時應該思考點擊提交按鈕後應該發生了哪些些數據流轉過程:點擊提交按鈕後,這個按鈕觸發的是提交form表單的action 指向的是控制層的哪個方法或js腳本中的某個function, 下來就是控制程方法接收數據後又調用的時service的哪個方法,繼續直到到後臺調用的是哪個數據庫的sql再就是返回值返回頁面數據的過程。

在這個過程中業務數據跟着業務程序邏輯在流轉。再根據頁面展現的錯誤現象及報錯提示信息,推測該錯誤可能會發生在這個業務數據流轉過程中的哪個位置,從而確定我們調試的斷點位置。調試,找出錯誤原因,提出解決方案,解決後再次測試。

4.程序調試步驟方法

​ 1)根據錯誤提示信息及業務功能邏輯的推理等相關信息【與錯誤徵兆有關的提示信息】找到有可能會導致錯誤發生的位置
異常錯誤日誌信息定位錯誤發生位置
日誌信息的輸出位置一是控制檯輸出,這時最及時的一種方式,在程序運行時可以很容易就看到日誌輸出信息。二是輸出日誌信息到日誌文件中,這種方式根據項目要求配置日誌相關信息[日誌輸出級別、日誌輸出路徑]
這些日誌信息分爲以下幾種
【1】系統程序代碼中自己標記的日誌信息
在這裏插入圖片描述
錯誤日誌
在這裏插入圖片描述
當程序執行發生錯誤時,在日誌文件或控制檯輸出時就會輸出到已標記的日誌信息,根據輸出的已標記信息通過工具搜索定位到具體的打印日誌的方法。
【2】 錯誤信息沒有我們標記的日誌,而是在程序執行中發生錯誤導致的異常錯誤信息提示如下:

在這裏插入圖片描述

1》2019-07-01-13-05 [http-nio-192.168.200.169-8443-exec-1] [org.thymeleaf.TemplateEngine] [ERROR] - [THYMELEAF][http-nio-192.168.200.169-8443-exec-1] Exception processing template "findFlpcList": An error happened during template parsing (template: "class path resource [templates/findFlpcList.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/findFlpcList.html]")
2》Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)
3》Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)
4》Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 10

這種在日誌文件或控制檯中輸出的異常錯誤信息,我們看日誌錯誤信息按照這種思路

1》中表示了錯誤發生的位置,比如:
An error happened during template parsing (template: "class path resource [templates/findFlpcList.html
可以推測出發生錯誤的地方應該templates/findFlpcList.html文件中,原因是An error happened during template parsing模板解析時出錯。在調試排查錯誤位置點時重點就可以在代碼中的查找findFlpcList.html文件。
		2》、3》、4》的 Caused by中就顯示了錯誤造成的原因。比如:
		Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)就顯示了在模版findFlpcList 的27行 "#strings.substring(flpcDTO.createTime,0,10)"發生 SpringEL expression異常
緊接着看下一句
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 10
可以看出錯誤原因就是字符索引越界了,這樣我們就可以推測可能爲flpcDTO.createTime 取值有問題或者(0,10)截取不對。下來要做的就是 將flpcDTO.createTime 的值打印輸出 查看具體值是什麼,判斷錯誤發生原因。這一步就是下面的調試。

​ 2.1)在IDE中進行啓動debug調試模式,進行***標記斷點***”“ 。注意:一般打斷點的方式及位置是

​ 【1】在有可能發生錯誤的方法的第一行邏輯程序打程序斷點。

​ 【2】方法中最有可能發生錯誤的那一行打程序斷點。

​ 【3】在程序運行到斷點位置暫停時,進行下一步調試,這時需要特別***注意觀察***程序運行的每一步的數據是否爲業務流程處理的正確數據。

​ 2.2)打印輸出相關信息 ->system.out.println()

​ 【1】打印信息在方法中最有可能發生錯誤的那一行上一行或下一行,將程序執行的參數、返回結果值在控制檯進行輸出,檢查輸出的結果值是否爲程序執行咱們想要的結果,進而判斷錯誤發生點。

​ 【2】這種打印輸出信息的方法也是在某些不支持debug的系統調試的一個重要方法。

​ 3)在打斷點和標記打印輸出後,現在開始進行debug模式調試。

​ 當程序運行到斷點,這時程序在一個暫停狀態,我們需要進行程序單步向下執行,觀察每一步中的輸入參數數據是否正確或調用方法的返回值數據是否正確,當程序運行到一個方法時我們可以繼續單步向下執行不管方法內部的邏輯只關心返回值,也可以使用程序調試方法中的進入方法內部繼續追蹤程序(進入方法內部後繼續單步執行或跳出方法內部),直到程序執行發生錯誤,判斷是否爲程序錯誤發生的實際位置

​ 另一種情況當程序運行起來後,業務處理髮生錯誤,並沒有進入我們的斷點或打印輸出語句,這時就是我們推測的程序發生的位置不對,需要根據錯誤信息和業務處理流程邏輯重新推測錯誤發生位置,重新再次進行第2步。

​ 4)當查找問題時注意將問題細化拆解,看看一個大問題中,程序正確執行到哪一步,精確定位錯誤點。

5.1後臺調試工具

調試的主要方法,(1)單步走 (2)進入方法內部(3)跳出方法,不管在那個工具中應該都有這樣的功能,只是這些功能的快捷鍵不同。下面介紹幾種工具

idea的debug調試功能

1)向下單步執行 [step over F8] ,就是程序一句一句的執行。

2)進入內部[step into F7],就是進入調用方法的內部,接下在單步執行,一句一句的檢查程序的執行情況。

  1. 強制進入內部[force step into Alt+shifit+F7]

4)跳出內部 [step out shift+F8] 就是跳出方法。
idea中的調試按鈕
idea調試模式

eclipse的debug調試功能

1)進入內部[step into F5]

  1. 向下單步執行 [step over F6]

3)跳出內部 [step return F7]
eclipse中的調試按鈕

日誌控制檯的輸出logger.error()、logger.info(),根據日誌信息提示,尋找問題出錯的位置及出錯原因。常說一句話“看日誌或控制檯有沒有報錯輸出。“
自己指定的system.out.println() 的打印輸出,這種方式是在自己根據預測的錯誤點的位置進行打印相關信息,進而驗證和查看自己對錯誤原因及錯誤位置的定位。

模擬瀏覽器發送請求的工具 有: Postman、curl

5.2.前臺瀏覽器調試工具方法

和後端調試工具應具有的調試功能相似,

在chrome,fireFox、ie、qq、360、瀏覽器中的調試快捷鍵通常都爲 F12

按下F12快捷鍵進入調試模式,瀏覽器的調試目標 針對 js 、html、css 樣式。
打印輸出 console.log()、彈出信息方式alert()。

js腳本調試
js 腳本調試
html及css調試
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章