函數與調試
正常程序的調試使用gdb。但有時也會在程序中通過使用printf(),打印關鍵信息進行bug定位及調試。接下來通過實踐不斷優化改善:
1,通過在程序中直接使用printf()函數進行開發調試。但在開發調試測試結束后,必須刪除相應的調試打印函數(printf)。因為過多的打印函數存在會影響效率,所以上線時會刪掉調試打印函數。但這樣就導致了生成程序出現bug需測試環境調試定位時,又得重新書寫printf進行打印調試。
2,通過使用DEBUG來控制printf函數的調用使用如下:
void test( void )
{
/* do something */
#ifdef DEBUG
printf("Tets Debug\n");
#endif
/* do something */
}若想打印出printf信息,只要在編譯時加入DEBUG選項即可。使用如下:gcc -DDEBUG main.c
此時雖然在DEBUG是已經滿足要求,需要調試時才會執行。更不會影響生產線的執行效率。但過多的#ifdef和#endif嵌套會影響代碼風格,且會影響可讀性。故有了下一版本。
3,使用宏處理。
定義個DEBUG_WRITE宏,在調試狀態時指向write_debug函數;非調試狀態DEBUG_WRITE定義變成了(void)。
使用stderr而不是stdout的原因是:stderr不存在緩存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#ifdef DEBUG
#define WRITE_DEBUG( arg ) write_debug arg
#else
#define WRITE_DEBUG( arg )
#endif
/**
* @brief debug日志信息打印函數
*
* @param fmt
*/
void
write_debug( char *fmt, ... )
{
va_list vl;
va_start( vl, fmt );
vfprintf( stderr, fmt, vl );
va_end( vl );
}
int
main( int argc, char *argv[] )
{
int num = 10;
char *str = "szyu";
/* 使用時里面的括號不能省略 */
WRITE_DEBUG( ( "num...%d, str...%s\n", num, str ) );
return 0;
}較之前版本,風格統一且不影響可讀性。
本文參考自《征服C指針》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。