如何测试gcc?

如何测试gcc?,gcc,instrumentation,Gcc,Instrumentation,出于某些目的,我不得不使用gcc。目标是能够跟踪在特定编译过程中调用的GCC函数。不幸的是,我不太熟悉GCC的体系结构,所以我需要一些帮助。我尝试了以下步骤: 1) 入侵gcc/Makefile.in并将“-finstrument functions”标志添加到T\u CFLAGS 2) 我已经实现并测试了开始测试和结束测试功能的版本。它们是在toplev_main()调用前后从gcc/main.c调用的。包含的文件链接到gcc(对象被添加到OBJS common,依赖关系稍后在gcc/Make

出于某些目的,我不得不使用gcc。目标是能够跟踪在特定编译过程中调用的GCC函数。不幸的是,我不太熟悉GCC的体系结构,所以我需要一些帮助。我尝试了以下步骤:

1) 入侵gcc/Makefile.in并将“-finstrument functions”标志添加到T\u CFLAGS
2) 我已经实现并测试了开始测试结束测试功能的版本。它们是在toplev_main()调用前后从gcc/main.c调用的。包含的文件链接到gcc(对象被添加到OBJS common,依赖关系稍后在gcc/Makefile.in中定义)
3) 使用contrib/download_先决条件下载先决条件。
4) 从干净的生成目录(与源目录处于同一级别)执行配置:
/。/gcc-4.6.2/configure--prefix=“/opt/gcc-4.6.2/”--enable languages=“c,c++”

5) 以“全部生成”开始生成

这样,虽然我有28G,但我的内存已经用完了。
接下来,我尝试从Makefile中删除T_CFLAGS设置,并将-finstrument函数赋予make命令:
make CFLAGS=“-finstrument functions”
。通过这种方式构建是成功的,但是当我试图编译一些东西时,结果是空的输出文件。(理论上,end_test应将其结果写入给定文件。)

我做错了什么?
提前谢谢

除非您明确将其排除在检测之外,否则,
main
本身会受到检测的影响,因此在
main
内部调用
start\u test
end\u test
并不是您想要做的事情。确保文件在正确的时间打开和关闭的“正确”方法是定义“构造函数”和“析构函数”,GCC会在
main
之前和之后自动生成对它们的调用:

void start_test (void)
  __attribute__ ( (no_instrument_function, constructor));

void end_test (void)
  __attribute__ ( (no_instrument_function, destructor));

/* FILE to write profiling information.  */
static FILE *profiler_out;

void start_test (void)
{
  profiler_out = fopen ("profiler.out", "w");
  if (profiler_out == NULL)
    exit (-1);
}

void end_test (void)
{
  fclose (profiler_out);
}
脚注:

  • 阅读有关
    构造函数
    析构函数
    无仪器功能
    属性的更多信息。它们是GCC理解的函数属性
  • 请在IBM网站上阅读

  • 好吧,让我们看看我是否理解正确:上面的代码草图进入了一个助手文件,比如说Instrumenter.c,与项目链接的内容。此外,我必须将-finstrument functions标志传递给CFLAGS。就这些?我不需要在任何地方调用start_test和end_test函数吗?@user1437750-不,你不需要这样做。GCC inserts在
    main
    之前和之后单独调用
    start\u test
    ('constructor')和
    end\u test
    ('destructor')。@user1437750-我在答案本身添加了几个带有URL的注释。非常感谢。根据这一页,我创建了自己的instrumenter函数,这些函数对于一些小例子来说可以很好地工作,但是对于gcc,我仍然不能确定是否正确地放置了标志。如果我在make阶段将-finstrument函数赋予CFLAGS(
    CFLAGS+=“-finstrument函数”
    ),那么什么都没有发生。另一方面,如果将gcc/Makefile.in修改为
    T\u CFLAGS=-finstrument functions-g
    ,则建筑内存不足。顺便说一句,还将instrumenter.c添加到gcc/Makefile.in:OBJS common=\。。。仪器仪表。。。和instrumenter.o:instrumenter.c添加到对象定义中。是的,我忘了将您添加为收件人:)是否要在编译GCC时跟踪其内部函数?或者你正在编译什么?