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

Debugging Gcc:在编译期间添加自动调试信息,debugging,gcc,compilation,gcc-plugins,Debugging,Gcc,Compilation,Gcc Plugins,我被要求实现一种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{

我被要求实现一种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),我期望得到以下输出:

  • 称为argn:4的阶乘
  • 称为argn:3的阶乘
  • 称为argn:2的阶乘
  • 称为argn:1的阶乘
  • 返回的阶乘值为1
  • 返回的阶乘值为2
  • 阶乘返回值为6
  • 阶乘返回值为24

所以,我需要的是编译代码段中所有函数的输出。我不知道我是否理解了这一点,但关键是我希望避免手动添加调试信息,而是通过编译步骤。有人建议我使用它,我正在第一次尝试使用它,但我想知道是否还有其他选择。欢迎各种意见或建议。

您可以使用

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

伟大的我知道我可以在每个函数中编写宏,但我想知道是否有一种方法可以构建一种框架,在编译过程中自动在所有函数中添加宏。理想情况下,我不会修改源文件。如果你做了一次,你可以为每个平台或每个任务定制,你只需要放一次你的marcors。