首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言調試方法入門:單步執行、斷點、變量監視與畢達哥拉斯定理演示程序

     編輯:關於C

調試的核心價值

「調試是將『以為正確』轉化為『確定正確』的過程。不會調試,寸步難行。」

掌握 IDE(Visual Studio、VS Code、Code::Blocks、CLion)或命令行調試器(GDB)的基本操作,是程序員必備基本功。

核心調試技術

技術操作用途
斷點F9 / 滾動條點擊暫停執行,檢查狀態
單步執行F10 (Step Over)逐行執行,不進入函數
單步進入F11 (Step Into)進入函數內部
單步跳出Shift+F11 (Step Out)執行完當前函數返回
變量監視Watch 窗口 / 懸停實時查看變量值、表達式
調用堆棧Call Stack 窗口查看函數調用鏈
內存/寄存器Memory/Registers 窗口底層狀態檢查
條件斷點右鍵斷點 → Condition滿足條件才中斷(如 i==100)

實戰演示程序:畢達哥拉斯定理計算斜邊

需求

  • 循環輸入直角三角形兩直角邊長 a, b。
  • 驗證 a>0, b>0,否則提示重輸。
  • 調用自定義函數 hypot(a,b) 計算斜邊 c = sqrt(a²+b²)。
  • 輸出結果。

完整代碼(含行號註釋)


  1: #include 
  2: #include 
  3: 
  4: // 函數聲明
  5: double hypot(double a, double b);
  6: 
  7: int main() {
  8:     while (1) {                    // 無限循環,直到手動終止
  9:         double a, b;
 10:         printf("請輸入兩條直角邊長: ");
 11:         if (scanf("%lf %lf", &a, &b) != 2) { // 輸入失敗處理
 12:             printf("輸入格式錯誤\n");
 13:             while (getchar() != '\n'); // 清理緩衝區
 14:             continue;
 15:         }
 16:         if (a > 0 && b > 0) {      // 合法性檢查
 17:             printf("斜邊長: %.4f\n", hypot(a, b));
 18:         } else {
 19:             printf("邊長必須為正數,請重新輸入!\n");
 20:         }
 21:     }
 22:     return 0;
 23: }
 24: 
 25: // 自定義函數:計算斜邊
 26: double hypot(double a, double b) {
 27:     return sqrt(a*a + b*b);        // 畢達哥拉斯定理
 28: }

調試實驗步驟

  1. 在 第 17 行 設置斷點。
  2. 運行程序,輸入 3 4,程序暫停。
  3. 打開 Watch 窗口,添加 a、b、a*a+b*b、hypot(a,b)。
  4. 按 F11 進入 hypot 函數,觀察 sqrt 參數與返回值。
  5. 按 Shift+F11 跳出,繼續主循環。
  6. 嘗試輸入 -1 5,觀察第 16 行條件判斷為假,跳轉至第 19 行。
  7. 在 scanf 設置條件斷點 a==0 && b==0,驗證邊界處理。

常見調試場景與技巧

  • 段錯誤定位:運行至崩潰,查看調用堆棧,定位非法訪問行;檢查指針是否為 NULL、數組越界、棧溢出。
  • 邏輯錯誤:在關鍵決策點(if/while 條件、循環邊界)設置斷點,單步觀察變量演變。
  • 死循環:暫停執行,查看循環變量為何不更新;條件斷點捕獲特定迭代。
  • 浮點數異常:監視中間計算結果,檢查 NaN/Inf 產生源頭(除零、溢出、無效運算)。
  • 內存洩漏:配合 Valgrind/AddressSanitizer,而非純手動調試。

調試心法

  1. 小步快跑:每次修改一處,立即驗證,而非積累大量改動再測試。
  2. 假設-驗證:先推測錯誤原因,設計最小實驗驗證,而非盲目單步。
  3. 可視化思維:善用 Watch、Memory、Call Stack 窗口,將抽象狀態可視化。
  4. 日誌先行:關鍵路徑加日誌,復現困難的 Bug 靠日誌回溯,調斷點只作輔助。
  5. 版本控制配合:git bisect 定位引入 Bug 的提交,比單步調試高效得多。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved