| 錯誤類型 | 典型程式碼 | 現象 | 除錯關鍵 |
|---|---|---|---|
| 野指標 | int *p; *p = 10; | 隨機崩潰/資料損壞 | 觀察 p 是否為 0x0/0xCCCCCCCC/隨機值 |
| 釋放後使用 | free(p); *p = 5; | Heap corruption, 雙重 free | Valgrind/AddressSanitizer 偵測 |
| 越界存取 | int a[10]; a[10] = 0; | 靜默資料損壞/崩潰 | 編譯加 -fsanitize=address 或 VS 勾選啟用位址消毒器 |
| 雙重釋放 | free(p); free(p); | Heap 鎖死/崩潰 | 釋放後置 NULL: free(p); p=NULL; |
| 棧上位址外洩 | int* f() { int x; return &x; } | 呼叫者得到無效位址 | 靜態分析/編譯器警告 -Wreturn-local-addr |
| const 違規 | const char *s="abc"; s[0]='x'; | 段錯誤 (寫入唯讀段) | 編譯器警告 -Wdiscarded-qualifiers |
(gdb) print p # 印指標值 (位址)
(gdb) print *p # 印指向的值 (解參考)
(gdb) print *(int*)0x7ff... # 任意位址解參考
(gdb) x/10xw p # 以 16 進位顯示 p 起始 10 個字 (4 bytes)
(gdb) watch *p # 監視 *p 變化 (硬體斷點)
(gdb) bt # 堆疊回溯,看崩潰時呼叫鏈
p, *p, p[0]@10 (陣列檢視)。*p,寫入時中斷。int *p = NULL; 或 int *p = &var;。if (p) { ... }。malloc 負責 free,用命名慣例 create_xxx/destroy_xxx。const 保護只讀資料:void print(const int *arr, size_t n)。-Wall -Wextra -Wpedantic -Wshadow -Wconversion (GCC/Clang) 或 /W4 (MSVC)。