'-finstrument-functions' 不打印函数名称

问题描述 投票:0回答:3

根据这个答案,它应该打印所有函数名称:

[root@ test]# cat hw.c
#include <stdio.h>

int func(void)
{  
  return 1;
}
int main(void)
{
  func();
  printf("%d",6);
  return 6;
}
[root@ test]# gcc -Wall hw.c -o hw -finstrument-functions
[root@ test]# ./hw 
6
[root@ test]# gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
Copyright (C) 2006 Free Software Foundation, Inc.

为什么它对我不起作用?

c gcc
3个回答
11
投票

这是来自 gcc 手册:

-金融工具功能

生成仪器要求 进入和退出函数。只是 在函数输入之后和之前 函数退出,进行如下剖析 函数将被调用 当前函数的地址和 它的调用站点。 (在某些平台上, __builtin_return_address 不能在当前函数之外工作,因此 呼叫站点信息可能不 可用于分析功能 否则。)

void __cyg_profile_func_enter(void *this_fn,void *call_site);

void __cyg_profile_func_exit(void *this_fn,void *call_site);

除非有东西实现这些功能,否则您将收到链接器错误(这就是 MinGW 发生的情况)。可以想象,您的 GCC 版本提供了空的实现。

我通过提供此实现使其与 MinGW GCC 一起使用:

#include  <stdio.h>

void __cyg_profile_func_enter (void *this_fn, void *call_site) {
    printf( "entering %p\n", this_fn );
}

void __cyg_profile_func_exit (void *this_fn, void *call_site) {
    printf( "leaving %p\n", this_fn );
}

但这仅给出了函数地址。我本以为应该有一个 GCC 默认实现,但似乎没有。

人们可能也对 调用树的可视化感兴趣,它使用 -fintrument-functions 标志 - 警告,我自己还没有尝试过。


1
投票

您实际上没有实现任何仪器。

-finstrument-functions
开关只是告诉 gcc 在每个函数的入口和出口处调用某个函数。但是您必须自己定义这些函数(通常这是通过链接分析器库来完成的)。


0
投票

编写 __cyg_profile_func_enter 和 __cyg_profile_func_exit 并不复杂。最简单的解决方案是确保上述函数将地址详细信息写入文件,并有一个单独的进程从文件中读取地址并使用可执行文件的符号表解析它们。如果您尝试在函数本身中进行地址解析,可能需要一些时间。

我发现了以下文章 - http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

它使用 binutils 中的 addr2line 来实现此目的。看看这是否对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.