DEBUG MACRO
e.g.#define BASIC_DEBUG 1
#define EXTRA_DEBUG 2
#define SUPER_DEBUG 4
#if (DEBUG & EXTRA_DEBUG)
.................
#endif
- Use the compiler to define the DEBUG such as -DDEBUG=5
assert
善用assert巨集,判斷程式執行正確。assert 會將錯誤資訊送到stderr,隨後呼叫abort終止程式
e.g.
#include <assert.h>
void assert(int expression);
利用NDEBUG來定義assert這個巨集,如果NDEBUG被定義,就會取消assert定義。所以在編譯過程中,如果加上-DNDEBUG或是在程式碼assert.h之前加入 #define NDEBUG,就會關閉assertion的動作
利用NDEBUG來定義assert這個巨集,如果NDEBUG被定義,就會取消assert定義。所以在編譯過程中,如果加上-DNDEBUG或是在程式碼assert.h之前加入 #define NDEBUG,就會關閉assertion的動作
syslog
當程式無法將錯誤訊息輸出到stdout 或是 stderr 時,善用syslog
e.g.
#include <syslog.h>
void syslog(int priority,char *format,...);
void openlog( char *ident, int option, int facility);
void closelog( void );
void closelog( void );
GDB
e.g.
- gcc -g -o xxx xxx.c
- gdb
- (gdb)file ./xxx
- r
e.g.
- gcc -g -o xxx xxx.c
- gdb --args ./add 3 5
- r
e.g.
core dump,檔案名稱為core,這是程式的記憶體映像
- r = (run)執行一個程式
- bt = (backtrace)堆疊追蹤
- p = (print)檢驗變數
- l = (list)程式列表
- b = (break)設定中斷點
- c = (cont)讓程式繼續執行
- display 程式在遇到中斷點而停止時,自動顯示陣列數值
- commands ... end 指定一些命令,這些命令會在遇到中斷點時被執行
- info display 查看display的狀況
- info break 查看中斷點的狀況
- disable break 1 暫停中斷點1
gprof
Use gprof to profiling C program on Ubuntu 12.04e.g.
- gcc -pg xxx.c -o xxx
- ./xxx # it will generate gmon.out at this step
- gprof xxx gmon.out > xxx.gprof # use gprof to generate document
- vim xxx.gprof
ctags
cxref
cflow
ElectricFence Library - 記憶體除錯
**Valgrind - 偵測陣列錯誤存取與記憶體除錯
e.g.
$ valgrind --leak-check=yes -v ./add_vec
相關文件
- DEBUG HACKS 除錯駭客
- Linux 程式設計教學手冊 CH10
- gdb入門介紹
- Valgrind Tutorial