除錯

筆記各種除錯的方式,如斷言、反向除錯等

斷言

斷言(Assertions),在C中assert為macro不是function,使用時需要#include <assert.h>, 程式出現非預期的數值時則結束程式用於除錯。

以下程式原本square()預期為i * i,但返回卻是i * i + 1, 因此斷言則會在下行判斷並且中斷程式。

#include <stdio.h>
#include <assert.h>

int square(int i) {
  return i * i + 1;  // assert working
}

int main() {
  int i = square(4);
  assert(i == 16);

  return 0;
}

禁用assert#include <assert.h>之前加上#define NDEBUG

#define NDEBUG
#include <assert.h>

使用時機

參考

反向除錯

回溯記憶體

Effective Debugging 建議熟悉反向除錯的技巧,可以節省除錯步驟增加效率1

而反向除錯實踐技術有重放、反向執行、檢查點等相關2

方式

工具

pacaur -S rr

參見

核心傾印

Core Dump,核心轉儲內容為崩潰程式的記憶體影像1

coredumpctl 可以查詢相關紀錄

小黃鴨除錯法

透過對小黃鴉代表完全不理解技術的人,解釋程式碼行為而找出錯誤。

相關概念

監視點

監視程式在特定情況時除錯器進行特定行為

記憶體檢測工具

自動化除錯腳本

參見 自動化 gdb 腳本

延伸


  1. Effective Debugging 第四章 除錯技巧 ↩︎ ↩︎

  2. Engblom, J., 2012, September. A review of reverse debugging. In Proceedings of the 2012 System, Software, SoC and Silicon Debug Conference (pp. 1-6). IEEE. ↩︎


Debug