从 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_a
和 func_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_a
和func_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 结果中排除函数的主要内容,如果未能解决你的问题,请参考以下文章