如何测量gcc?

时间:2012-06-05 16:02:49

标签: gcc instrumentation

出于某些目的,我必须使用gcc。目标是能够跟踪特定编译期间调用的GCC函数。不幸的是,我并不熟悉GCC的架构,所以我需要一些帮助。我尝试了以下步骤:

1)黑客攻击gcc / Makefile.in并在T_CFLAGS中添加“-finstrument-functions”标志。
2)我已经实现并测试了 start_test end_test 功能。在toplev_main()调用之前和之后,从gcc / main.c调用它们。包含文件链接到gcc(该对象被添加到OBJS-common中,并且依赖关系稍后在gcc / Makefile.in中定义)
3)使用contrib / download_prerequisites下载先决条件 4)从干净的构建目录(与源目录处于同一级别)执行配置:./../gcc-4.6.2/configure --prefix="/opt/gcc-4.6.2/" --enable-languages="c,c++"
5)用“make all”开始构建

这样我跑出了记忆,虽然我有28G 接下来,我尝试从Makefile中删除T_CFLAGS设置,并将-finstrument-functions命令给make命令:make CFLAGS="-finstrument-functions"。这种构建方式是成功的,但是当我尝试编译某些东西时,它会产生空输出文件。 (理论上 end_test 应该将其结果写入给定文件。)

我做错了什么? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

除非您明确地将其排除在检测范围之外,否则main本身需要使用检测功能,因此请拨打start_testend_test 内的电话 {{1不是你想要的方式。确保文件在正确的时间打开和关闭的“正确”方法是定义“构造函数”和“析构函数”,GCC会在main之前和之后自动生成对它们的调用:

main

脚注:

  1. 详细了解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); } constructordestructor属性here。它们是GCC理解的功能属性。
  2. 在IBM网站上阅读此excellent guide to instrumentation