learncpp-3 除錯

dengkang1122發表於2024-08-08

3 除錯

3.1 語法和語義錯誤

  • 不符合C++語法的語句會產生語法錯誤(例如缺少分號/使用未宣告變數/括號不匹配),編譯器會捕捉語法錯誤
  • 語法沒錯但是執行結果不對稱為語義錯誤/邏輯錯誤(分母為0/使用未初始化變數)

現代編譯器可以檢測到一些常見的邏輯錯誤,例如使用一個未初始化的變數。但是大部分邏輯錯誤編譯器無法捕獲

3.2 除錯過程

  • 找到問題根因
  • 理解問題
  • 決定解決方法
  • 修復問題
  • 重新測試

3.3 除錯策略

  • 程式碼檢查
  • 執行程式並重現問題

3.4 基本除錯手段

  • 註釋程式碼
  • 驗證程式碼流(在函式開頭加上輸出語句)

使用std::cerr而不是std::cout,因為cout是會快取的,cerr是立即輸出的

  • 輸出變數或表示式的值

3.5 更多除錯手段

  • 使用預處理指令來決定要不要輸出除錯語句
#include <iostream>
#define ENABLE_DEBUG // comment out to disable debugging
int main()
{
#ifdef ENABLE_DEBUG
std::cerr << "main() called\n";
#endif
    int x{ getUserInput() };
    std::cout << "You entered: " << x << '\n';
    return 0;
}
  • 使用logger將除錯資訊輸出到日誌檔案

相關文章