Gcc:在编译期间添加自动调试信息

时间:2013-11-04 13:50:28

标签: debugging gcc plugins compilation

我被要求实现一种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;
  }
}

现在执行后我想得到的是函数的跟踪,我的意思是我需要打印出每个调用中收到的参数值和返回值。例如,如果我执行factorial(4),我希望得到以下输出:

  • Factorial称为arg n:4
  • Factorial称为arg n:3
  • Factorial称为arg n:2
  • Factorial称为arg n:1
  • Factorial以值1返回
  • Factorial以值2返回
  • Factorial以值6返回
  • Factorial返回值24

所以,我需要的是编译的代码片段中所有函数的输出。我不知道我是否让我理解,但关键是我想避免手动但通过编译步骤添加这些调试信息。我被建议使用MELT,我正在尝试使用它,但我想知道是否有其他选项。欢迎提出各种意见或建议。

1 个答案:

答案 0 :(得分: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