為你的程式加上 Debugging Mode
使用 C 語言開發程式,往往面對的都是數不盡的奇怪臭蟲,若想為程式除錯,通常會使用很多的 printf function,將所有程式執行的流程以及階段訊息印在畫面上。不過,太多的除錯訊息多半也會造成效能的影響,甚至是造成程式在使用上的不便。尋思,若能在 compile 階段設定是否開啟 Debugging Mode,對程式開發和最後包裝釋出,都可減少不少時間花費。
本文主要說明,如何利用 Autotool 和 C 語言 Macro,在 ./configure 執行階段決定啟動 Debugging Mode:
要達成目標,首先必需修改 configure.ac 並增加設定,使之後產生的 configure 檔案可支援 --enable-debug:
然後在程式中的 C Header (確定該檔案是所有程式碼都會 Include 的 Header),加讓以下 Macro:
然後我們就可以在程式中使用 DEBUG() 的 Macro,用法和 printf function 一樣,只是該字串只在 Debugging Mode 被啟用時才會被編譯進程式裡:
該程式執行後,就會看到類似下面的訊息:
由於在 C header 中設計的 DEBUG(),也包括了檔案名稱和程式碼行數,對於開發人員做除錯的工作就相當方便。
本文主要說明,如何利用 Autotool 和 C 語言 Macro,在 ./configure 執行階段決定啟動 Debugging Mode:
./configure --enable-debug
要達成目標,首先必需修改 configure.ac 並增加設定,使之後產生的 configure 檔案可支援 --enable-debug:
AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [Enable debugging]), CFLAGS="$CFLAGS -g -D_DEBUG")
然後在程式中的 C Header (確定該檔案是所有程式碼都會 Include 的 Header),加讓以下 Macro:
#ifdef _DEBUG #define DEBUG(format, args...) printf("[%s:%d] "format, __FILE__, __LINE__, ##args) #else #define DEBUG(args...) #endif
然後我們就可以在程式中使用 DEBUG() 的 Macro,用法和 printf function 一樣,只是該字串只在 Debugging Mode 被啟用時才會被編譯進程式裡:
void main() { DEBUG("Debugging Mode was enabled\n") printf("Hello World!\n"); }
該程式執行後,就會看到類似下面的訊息:
[main.c:3] Debugging mode was enabled Hello World!
由於在 C header 中設計的 DEBUG(),也包括了檔案名稱和程式碼行數,對於開發人員做除錯的工作就相當方便。
C++ 的作法(利用 dev-c++) 和這個有什麼不同的地方?謝。
回覆刪除此方法是供使用 Autotool 產生 Makefile 的人所使用,而大多數有專案管理的 IDE(如:dev-c++),通常會有自己的方式幫開發者處理 Debug 的問題。
回覆刪除如果是 cmake 的使用者的話, 可以在執行 cmake 時下參數改變 build type, 例如:
回覆刪除$ cmake CMAKE_BUILE_TYPE=Debug
或
$ cmake CMAKE_BUILE_TYPE=Release
如果寫死在 build script 裡 (CMakeLists.txt), 則是用
SET( CMAKE_BUILD_TYPE RelWithDebInfo )
或
SET( CMAKE_BUILD_TYPE MinSizeRel )
細節可參考: http://www.cmake.org/cmake/help/cmake-2-8-docs.html#variable:CMAKE_BUILD_TYPE