简体   繁体   中英

Excluding a function from gprof results

I want to exclude some functions from the output generated by gprof. In other words, I do not want them to be included when calculating percentage time spent by each function during execution. I read at one place -E option can be used.

However I'm using gprof -E function_to_be_exluded my_program_name , but nothing happens. The manual says it is depreciated and you should use symspecs instead. However, I have wasted half an hour trying to figure out how to achieve it with symspecs , but no luck. Anyone can kindly help me in this.

Exactly, gprof -e -E are deprecated and superseded by usage of newer relevant options that have argument - symspecs. So try using:

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.

Use this along with your other gprof options (-E -e definitely ruled out)

According to the man:

  • for display flat profile and exclude function from it you need use -P option:

     gprof main gmon.out -Pfunction_name
  • for display call graph and exclude function from it you need use -Q option:

     gprof main gmon.out -Qfunction_name

This options can be repeated and used in the same time:

gprof main gmon.out -Pfunction_name -Qfunction_name -Qother_function_name

If you need exclude function from one report but not exclude any function from other you need use -p or -q options.

Example:

Create program:

#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;
}

Compile it: gcc main.c -pg -o main

And launch:

$ ./main
func_a func_b func_c

Generate profile reports:

  • If you need print only flat profile you need call:

     $ 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
  • If you need print flat profile excluding functions func_a and func_c and full call graph you need call:

     $ 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] -----------------------------------------------
  • If you need print flat profile excluding functions func_a and func_c and call graph excluding func_b you need call:

     $ 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] -----------------------------------------------

Unless I've misunderstood what you're asking...

gprof a.out --no-time=function_name

works for me.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM