AnsweredAssumed Answered

How can we use perf to generate call-graphs? (Android 4.2.2 (JellyBean) on Sabre SD board)

Question asked by floriang on Jul 30, 2013



I would like to generate call-graphs to track optimizations that should be done in the source code of a complex application.

I tried to use oprofile and perf, but both fail to generate a proper call-graph for the part that is related to my library.


perf is able to generate a callgraph for kernel functions if provided with the kernel symbols.


I compiled my native library with the following flags:

LOCAL_CFLAGS := -g -fno-omit-frame-pointer $(LOCAL_CFLAGS)


Then when I get samples for the call graph I use:

perf record -g -ecpu-clock -c50000 -p<mypid>


and output the report via:

perf report -g > perfoutput.txt


When I look at this report, the hierarchy doesn't appear for the functions that are in my library. I got somethign like:

     7.43%  fec.fecbench   [.] FecBench7_NoOp3


            --- 0x78a8ea54


     1.84%  fec.fecbench   [.] rand


            --- 0x78a8ea3c


                --100.00%-- 0x0



            --- 0x78a8ea54


But actually I call rand() inside the FecBench_NoOp3 function, which is called by FecBench_NoOp2 function.

I expected the output to be something like:

FecBench_NoOp2 ---> FecBench_NoOp3 ---> rand().


But it seems that perf can not see that these functions are actually related.


But for the kernel functions I get a correct graph like:

0.11%  fec.fecbench  [kernel]           [k] _raw_spin_unlock_irqrestore


        --- _raw_spin_unlock_irqrestore


           |--55.21%-- do_send_sig_info


           |      kill_pid_info


           |      sys_kill


           |      ret_fast_syscall


           |      0x78a8ea54
           |--15.10%-- try_to_wake_up


           |      |    
           |      |--68.97%-- run_timer_softirq


           |      |      __do_softirq


           |      |      irq_exit


           |      |      do_local_timer


           |      |      __irq_usr


           |      |      |    
           |      |      |--65.00%-- 0x78a8ea54
           |      |      |    
           |      |      |--20.00%-- 0x78a8ea3c



Any ideas? Don't hesitate to suggest another solution if you know of a good way to get a callgraph in android for native code.

I also tried with Oprofile but I think it didn't even give anything useful on the kernel...