9.1 錯誤的出現
程式偵錯是尋找和修正程式中錯誤或bugs的過程。這可是軟體開發中最有趣的部分,因為能確保程式正確運行。
"bug"這個詞的歷史
"bug" (錯誤) 這個詞在電腦程式的語境中最早於1940年代開始使用。即便如此,"bugs"這個概念在電腦出現前就已經存在,用來描述各種裝置的機械故障。
第一次有文獻記載的"bug"用於電腦科學是在1947年(!),一支在哈佛大學處理Mark II電腦的團隊發現當時機器的一個繼電器因為有蛾子進入而失效。他們移除了那隻昆蟲,並記錄下來作為"發現真正bug的第一個實例"(literal bug)。
雖然這不是第一次用"bug"來指代錯誤,但這次事件讓這個詞變得廣為人知並促進了其普及。
程式偵錯
偵錯是尋找、診斷和修正程式錯誤的過程。偵錯過程包括幾個階段:
- 錯誤發現: 確定顯示程式有錯誤的症狀。
- 錯誤重現: 創建錯誤再次出現的情境以便更好地了解其性質。
- 問題診斷: 使用各種工具和方法分析代碼,找出錯誤的原因。
- 錯誤修正: 修改代碼以消除錯誤。
- 測試: 驗證修正並測試程式,以確保錯誤被消除,且沒有引發其他問題。
所以 bug 就是對程式中的任何錯誤的統稱,而 de-bug 是發現並消除這些錯誤的過程。
9.2 偵錯工具和方法
日誌記錄(Logging)
在程式碼中加入日誌,能讓你追蹤程式執行並在不同階段獲得變量和操作的狀態信息。對於JavaScript的日誌記錄,有個不錯的庫—winston。
日誌記錄的使用範例:
const { createLogger, format, transports } = require('winston');
// 創建偵錯等級的記錄器
const logger = createLogger({ level: 'debug' });
// 除法函數
function divide(a, b) {
logger.debug(`除法 ${a} 除以 ${b}`);
if (b === 0) {
logger.error("嘗試除以零!");
return null;
}
return a / b;
}
// 使用函數的範例
const result = divide(10, 2);
console.log(result); // 輸出: 5
使用偵錯器 (Debuggers)
偵錯器是一種工具,讓開發者可以逐步執行程式,設置停留點 (breakpoints),檢查和修改執行時的變量值。
JavaScript 的熱門偵錯器:
- Chrome DevTools: 在 Google Chrome 瀏覽器中內建的偵錯器
- Firefox Developer Tools: 在 Mozilla Firefox 瀏覽器中內建的偵錯器
- Node.js Debugger: Node.js 中的伺服器端 JavaScript 偵錯器
- Visual Studio Code Debugger: 內建於 Visual Studio Code 編輯器中的偵錯器
在 Node.js 中使用偵錯器的範例:
// 引入內建的util模塊
const { inspect } = require('util');
// 錯誤函數範例
function faultyFunction(a, b) {
debugger; // 設置停留點
let result = a / b;
return result;
}
// 呼叫有錯誤的函數
console.log(faultyFunction(10, 0));
當程式到達 debugger 時,它會暫停,你可以使用偵錯器的命令,比如逐步前進 (step over)、進入 (step into)、退出 (step out),以及檢查變量值等。
我們會在 Intellij IDEA 中學習用偵錯器來debug程式 (需要 Ultimate Edition 版本)。
9.3 使用 debug
debug 一般來說就是使用偵錯工具和技巧來發現和解決錯誤。
偵錯步驟:
- 設置停留點: 在程式碼中設置停留點來暫停程式在你感興趣的地方。
- 逐步執行: 當步執行程式,觀察程式狀態和變量值的改變。
- 分析變量: 驗證程式不同階段變量和表達式的值,以識別不正確的數據或邏輯錯誤。
- 修正錯誤: 修改代碼來消除找到的錯誤。
- 再次測試: 錯誤修正後,測試程式以確保錯誤被修正且沒有新問題出現。
看起來很簡單吧?在下一講中我們會詳細探討每個步驟 :)
GO TO FULL VERSION