如何测试gcc?
出于某些目的,我不得不使用gcc。目标是能够跟踪在特定编译过程中调用的GCC函数。不幸的是,我不太熟悉GCC的体系结构,所以我需要一些帮助。我尝试了以下步骤: 1) 入侵gcc/Makefile.in并将“-finstrument functions”标志添加到T\u CFLAGS如何测试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
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理解的函数属性好吧,让我们看看我是否理解正确:上面的代码草图进入了一个助手文件,比如说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时跟踪其内部函数?或者你正在编译什么?