术语 | 意义 |
---|---|
ftrace (内核function tracer) | 一款函数调用跟踪程序,最早仅能够记录内核的函数调用流程,现在已经逐步发展成一个框架。 |
uftrace (用户态function tracer) | ftrace的用户态程序版本,主要用于用户态程序函数调用流程分析,性能分析等。 |
uftrace主要用于函数调用性能分析,思路来源于内核函数性能分析工具 ftrace,其主要提供整个运行期间函数调用流程以及开销分析,也可生成性能报告。
1 编辑源文件
#include <stdio.h>
void loop()
{
int i = 0;
for (i=0; i< 3; i++) {
printf("hello:%d.\n", i);
}
}
int main(int argc, char *argv[])
{
loop();
}
2 编辑 Makefile
test : main.c
gcc -pg main.c -o test
注意如果是gcc使用-pg 或 --finstrument-functions均可;clang目前只能使用 -pg。 若是qt工程需要加入 QMAKE_CXXFLAGS += -pg。
3 执行make生成test。
4 直接分析
$ uftrace ./test
hello:0.
hello:1.
hello:2.
# DURATION TID FUNCTION
1.254 us [ 29381] | __monstartup();
0.733 us [ 29381] | __cxa_atexit();
[ 29381] | main() {
[ 29381] | loop() {
4.827 us [ 29381] | printf();
0.408 us [ 29381] | printf();
0.215 us [ 29381] | printf();
6.826 us [ 29381] | } /* loop */
7.180 us [ 29381] | } /* main */
5 先采集数据再分析
$ uftrace record ~/Desktop/uftrace_test/test #注意此处的路径需要是全路径。
程序输出与直接执行一样,只是会在test执行完毕之后额外生成uftrace.data目录,其中记录回放数据。
6 绘制执行执行流程并profile
$ uftrace graph
# Function Call Graph for 'test' (session: a07fbf5d48ffdd37)
========== FUNCTION CALL GRAPH ==========
# TOTAL TIME FUNCTION
19.731 us : (1) test
1.206 us : +-(1) __monstartup
: |
0.623 us : +-(1) __cxa_atexit
: |
17.902 us : +-(1) main
17.513 us : (1) loop
16.428 us : (3) printf
4 生成分析报告:
$ uftrace report
Total time Self time Calls Function
========== ========== ========== ====================
17.902 us 0.389 us 1 main
17.513 us 1.085 us 1 loop
16.428 us 16.428 us 3 printf
1.206 us 1.206 us 1 __monstartup
0.623 us 0.623 us 1 __cxa_atexit