2013-11-04 30 views
1

我被要求實現一種gcc插件。基本上我必須做的是添加一些調試代碼,以便將調試信息添加到書面代碼中。Gcc:編譯期間添加自動調試信息

讓我們用一個例子來解釋我需要的東西。假設我們有以下功能

int factorial(int n){ 
    //printf("Factorial called arg n : %d", n); 
    if (n==0 || n == 1){ 
    //printf("Factorial returned with value %d", 1); 
    return 1; 
    } 
    else{ 
    int ret = n * factorial(n-1); 
    //printf("Factorial returned with value %d", ret); 
    return ret; 
    } 
} 

現在我想執行之後得到的是函數的痕跡,我的意思是,我需要打印出每次調用和返回值收到的參數值。例如,如果我執行階乘(4)我期望以下輸出:

  • 階乘稱爲ARG N:4
  • 階乘稱爲ARG N:3
  • 階乘稱爲ARG N:2
  • 階乘稱爲ARG N:1
  • 階乘與返回值1
  • 階乘返回具有值2
  • 階乘與返回值6
  • 階乘返回值爲24

所以,我需要的是此輸出在編譯的代碼段的所有功能。我不知道我是否讓我理解,但關鍵是我想避免手動添加這些調試信息,而是通過編譯步驟。我被建議使用MELT,我正在給我第一次嘗試,但我想知道是否有其他一些選項。歡迎各種意見或建議。

回答

0

您可以使用MACROs

int factorial(int n){ 
     #ifdef MYMACRO 
     printf("Factorial called arg n : %d\n", n); 
     #endif 
     if (n==0 || n == 1){ 
       #ifdef MYMACRO 
       printf("Factorial returned with value %d\n", 1); 
       #endif 
       return 1; 
     } 
     else{ 
       int ret = n * factorial(n-1); 
       #ifdef MYMACRO 
       printf("Factorial returned with value %d\n", ret); 
       #endif 
       return ret; 
     } 
} 

當你想編譯:

gcc -DMYMACRO myprog.c 

而當你不顯示輸出:

gcc myprog.c 
+0

太好了!我知道我可以在每個函數中編寫宏,但我想知道是否有辦法構建一種在編譯期間在所有函數中自動添加宏的框架。理想情況下,我不會修改源文件。 – pafede2

+0

如果您曾經這樣做過,您可以爲每個平臺或每個任務進行自定義,您只需要將自己的馬克作爲一次。 – PersianGulf