為你的程式加上 Debugging Mode

使用 C 語言開發程式,往往面對的都是數不盡的奇怪臭蟲,若想為程式除錯,通常會使用很多的 printf function,將所有程式執行的流程以及階段訊息印在畫面上。不過,太多的除錯訊息多半也會造成效能的影響,甚至是造成程式在使用上的不便。尋思,若能在 compile 階段設定是否開啟 Debugging Mode,對程式開發和最後包裝釋出,都可減少不少時間花費。

本文主要說明,如何利用 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(),也包括了檔案名稱和程式碼行數,對於開發人員做除錯的工作就相當方便。

留言

  1. C++ 的作法(利用 dev-c++) 和這個有什麼不同的地方?謝。

    回覆刪除
  2. 此方法是供使用 Autotool 產生 Makefile 的人所使用,而大多數有專案管理的 IDE(如:dev-c++),通常會有自己的方式幫開發者處理 Debug 的問題。

    回覆刪除
  3. 如果是 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

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄