daemon 的除錯訊息被殼層吃掉的時候, 將訊息丟到 console 可以方便除錯, 如果是每次呼叫 debug 時都 openfile 和 closefile 會有點浪費資源, 所以直接將 stdout 轉給 console, 就能繼續用 printf 來送出除錯訊息了.
做法就是開個 file handler 給 console, 然後重新將 stdout 設定給 console 的 file handler. 範例程式如下:
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main() { FILE *stdout_bk; FILE *fpout = fopen("/dev/console" ,"w" ); stdout_bk = stdout; printf("printf not to console\n"); stdout = fpout; printf("printf to console\n"); stdout = stdout_bk; return 0; } |
做成 MACRO
1 2 3 4 5 6 7 8 9 10 11 12 | #ifdef AIMDBG #undef AIMDBG #endif #define AIMDBG(fmt,...) \ do { \ FILE *console = fopen("/dev/console" ,"w" ); \ if (console) { \ fprintf(console, fmt, __VA_ARGS__); \ fflush(console); \ fclose(console); \ } \ } while(0) |
追加 Hexdump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | static void hexdump (uint8_t* ptr, int len) { int i; for (i=0; i<len; i++) { if (15 == (i % 16)) { AIMDBG("%02X\n", ptr[i]); } else if (7 == (i % 8)) { AIMDBG("%02X ", ptr[i]); } else { AIMDBG("%02X ", ptr[i]); } } AIMDBG("%s", "\n"); } |