【问题标题】:Gcc: adding automatic debug information during compilationGcc:在编译期间添加自动调试信息
【发布时间】:2013-11-15 03:43:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: debugging gcc compilation gcc-plugins


    【解决方案1】:

    你可以使用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
    

    【讨论】:

    • 太棒了!我知道我可以在每个函数中编写宏,但我想知道是否有一种方法可以构建一种框架,在编译期间自动将宏添加到所有函数中。理想情况下,我不会修改源文件。
    • 如果你做过一次,你可以为每个平台或每个任务定制,你只需要一次放你的marcors。
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多