从 gprof 结果中排除函数

Posted

技术标签:

【中文标题】从 gprof 结果中排除函数【英文标题】:Excluding a function from gprof results 【发布时间】:2011-07-08 10:25:45 【问题描述】:

我想从 gprof 生成的输出中排除一些函数。换句话说,我不希望在计算每个函数在执行期间花费的时间百分比时包含它们。我在一处看到-E选项可以使用。

但是我正在使用 gprof -E function_to_be_exluded my_program_name,但没有任何反应。手册说它已被折旧,您应该改用 symspecs。但是,我浪费了半个小时试图弄清楚如何使用 symspecs 来实现它,但没有运气。任何人都可以在这方面帮助我。

【问题讨论】:

您在分析什么语言? C? C++?还有什么?名称修改或命名空间可能会影响它。 没有名称修改,因为我使用的是纯 C 天哪!我非常沮丧,现在我正在编写自己的程序来从平面配置文件中过滤掉这些功能!糟透了! 你想要attribute((no_instrument_function))吗? 【参考方案1】:

确切地说,gprof -e -E 已被弃用并被具有参数的新相关选项的使用所取代 - symspecs。所以尝试使用:

gprof --no-time=symspec 

The -n option causes "gprof", in its call graph analysis, not to propagate times for
symbols matching symspec.

e.g.

gprof --no-time=name_of_function_you_dont_want_to_profile.

将此与其他 gprof 选项一起使用(-E -e 绝对排除)

【讨论】:

多功能怎么做? @MetallicPriest - 自己没有尝试过,但要将其用于多个功能,请多次使用不同的功能名称提供选项 --no-time。你试过了吗?【参考方案2】:

据男人说:

要显示平面配置文件并从中排除功能,您需要使用-P 选项:

gprof main gmon.out -Pfunction_name

要显示调用图并从中排除函数,您需要使用-Q 选项:

gprof main gmon.out -Qfunction_name

此选项可以重复使用:

gprof main gmon.out -Pfunction_name -Qfunction_name -Qother_function_name

如果您需要从一个报告中排除函数但不从其他报告中排除任何函数,您需要使用 -p-q 选项。

示例:

创建程序:

#include <stdio.h>
#include <stdlib.h>

void func_a () printf ("%s ",__FUNCTION__);
void func_b () printf ("%s ",__FUNCTION__);
void func_c () printf ("%s ",__FUNCTION__);

int main ()

    func_a ();
    func_b ();
    func_c ();
    return EXIT_SUCCESS;

编译它: gcc main.c -pg -o main

然后启动:

$ ./main
func_a func_b func_c

生成配置文件报告:

如果您只需要打印平面配置文件,您需要致电:

$ gprof main gmon.out -b -p  
  %   cumulative   self              self     total             
 time   seconds   seconds    calls  Ts/call  Ts/call  name      
  0.00      0.00     0.00        1     0.00     0.00  func_a  
  0.00      0.00     0.00        1     0.00     0.00  func_b  
  0.00      0.00     0.00        1     0.00     0.00  func_c

如果您需要打印平面配置文件,不包括函数 func_afunc_c 以及您需要调用的完整调用图:

$ gprof main gmon.out -b -Pfunc_a -Pfunc_c -q
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
  0.00      0.00     0.00        1     0.00     0.00  func_b

index % time    self  children    called     name
                0.00    0.00       1/1           main [9]
[1]      0.0    0.00    0.00       1         func_a [1]
-----------------------------------------------
                0.00    0.00       1/1           main [9]
[2]      0.0    0.00    0.00       1         func_b [2]
-----------------------------------------------
                0.00    0.00       1/1           main [9]
[3]      0.0    0.00    0.00       1         func_c [3]
-----------------------------------------------

如果您需要打印不包括函数func_afunc_c 的平面配置文件以及不包括func_b 的调用图,则需要调用:

$ gprof main gmon.out -b -Pfunc_a -Pfunc_c -Qfunc_b
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
  0.00      0.00     0.00        1     0.00     0.00  func_b

index % time    self  children    called     name
                0.00    0.00       1/1           main [9]
[1]      0.0    0.00    0.00       1         func_a [1]
-----------------------------------------------
                0.00    0.00       1/1           main [9]  
[3]      0.0    0.00    0.00       1         func_c [3]
-----------------------------------------------

【讨论】:

如何排除一个c++函数?我试过用命名空间格式的函数名“-P”,例如。 util::test_func 失败。我也试过编译c++命名规则后的符号名,失败了。【参考方案3】:

除非我误解了你在问什么......

gprof a.out --no-time=function_name

为我工作。

【讨论】:

以上是关于从 gprof 结果中排除函数的主要内容,如果未能解决你的问题,请参考以下文章

gcc -Ofast -pg 错误的 gprof 结果

从 gcov/lcov 覆盖结果中排除某些功能

将多个 gprof 结果文件合并到一个文件中

解释 gprof 结果和粒度

GPROF 平面轮廓空结果

gprof 输出不准确