当前位置: 首页 > Linux

arm平台uftrace交叉编译介绍

时间:2023-04-06 03:44:34 Linux

uftrace概述uftrace工具可以用来跟踪分析C/C++编写的程序。它深受Linux内核的ftrace框架(尤其是函数图跟踪器)的启发,并支持用户空间程序。它支持各种命令和过滤器,以帮助分析程序执行和性能。它的特点是:可以跟踪可执行文件中的每个函数并显示持续时间,也可以跟踪外部库调用(进入和退出),通常支持外部库或外部库嵌套的内部函数调用。它可以在函数级别显示详细的执行流程并报告哪个函数的开销最高,还可以显示与执行环境相关的各种信息。过滤器可以设置为在跟踪时排除或包含特定功能。此外,它还可以保存和显示函数参数和返回值。它支持多进程和多线程应用程序。如果内核启用了函数图跟踪器(CONFIG_FUNCTION_GRAPH_TRACER=y),那么它也可以跟踪内核函数(使用-k选项)。练习工具链:gcc-9.1.0-2019.11-x86_64_arm-linux-gnueabihfcompilewithcodegitclonehttps://github.com/namhyung/uftrace.git./configure--prefix=$PWD/output--host=arm-linux-gnueabihfmake-j5makeinstall生成的布局为:运行环境准备板子挂载共享目录ifconfigeth0upifconfigeth0xxx.xxx.xxx.xxxmount-tnfsxxx.xxx.xxx.xxx:/xxx/mnt-onolock将生成输出/*到共享目录的相应位置。开发板上的布局如下:使用-pg或-finstrument-functions编译二进制程序。本文始终以如下程序为例://multi_thread.c#include#includevoid*thread_funcA(void*arg){printf("%s:%d\n",__FUNCTION__,__LINE__);睡觉(5);printf("%s:%d\n",__FUNCTION__,__LINE__);returnNULL;}void*thread_funcB(void*arg){printf("%s:%d\n",__FUNCTION__,__LINE__);睡觉(10);printf("%s:%d\n",__FUNCTION__,__LINE__);返回NULL;}intmain(void){pthread_tthidA;pthread_tthidB;printf("%s:%d\n",__FUNCTION__,__LINE__);pthread_create(&thidA,NULL,thread_funcA,"funcA");printf("%s:%d\n",__FUNCT离子__,__LINE__);pthread_create(&thidB,NULL,thread_funcB,"funcB");printf("%s:%d\n",__FUNCTION__,__LINE__);pthread_join(thidA,NULL);printf("%s:%d\n",__FUNCTION__,__LINE__);pthread_join(thidB,NULL);printf("%s:%d\n",__FUNCTION__,__LINE__);return0;}编译如下:arm-linux-gnueabihf-gcc-pgmulti_thread.c-lpthread-omulti_thread将生成的multi_thread放入shared目录。需要注意的是,uftrace会在当前目录下创建fifo/utrace.data。如果在windows共享目录下,会提示如下错误:建议切换到板子上的/tmp目录:cd/tmp最后设置环境变量和动态库路径就可以愉快的玩了:exportPATH=/mnt/uftrace/bin:$PATHexportLD_LIBRARY_PATH=/mnt/uftrace/lib:$LD_LIBRARY_PATHbasictarget程序执行后,uftrace会输出各个函数的执行时间uftrace/mnt/multi_thread输出如下:filters-FFUNC,--filter=FUNC将过滤器设置为仅跟踪所选函数。uftrace-Fsleep-Fprintf/mnt/multi_thread输出结果如下:-CFUNC,--caller-filter=FUNC只显示所选函数的调用路径。uftrace-Csleep-Cprintf/mnt/multi_thread输出如下:-NFUNC,--notrace=FUNC设置过滤器不跟踪选择的函数uftrace-Nprintf/mnt/multi_thread输出如下:-tTIME,--time-filter=TIME不显示低于设定时间阈值的短函数。uftrace-t1ms/mnt/multi_threadArgumentsDetectionwithDebugInfo使用-a/--auto-args来检测带有调试信息的二进制程序的函数参数和返回值。uftrace-a/mnt/multi_thread输出结果如下:uftracerecord可以记录trace数据,方便后续分析。uftracerecord/mnt/multi_thread生成如下:uftracereplay可以回放对应的trace数据,默认回放当前目录下的uftrace.data。uftracereplayuftracereport打印trace数据的统计和汇总,默认是打印当前目录下的uftrace.data。basicuftrace报告输出如下:-s这个选项可以选择按总时间/自用时间/通话次数降序排序,默认按总计降序排序。Sortuftracereport-stotal按总时间降序排列,输出结果如下:Sortuftracereport-sself按self时间降序排列按调用次数降序排列uftracereport-scalluftracegraph显示函数调用图,默认是在当前目录中显示uftrace.data。uftracegraph的输出结果如下:综上所述,uftrace还是有很多强大的功能,比如通过dump命令生成相应的trace数据,可以在chrome浏览器中可视化或者生成火焰图;如果configure包含python,也可以写一个python脚本来定义函数入口和export的钩子函数;如果编译时加上-mnop-mcount,还可以实现运行时的动态跟踪;如果configure包括capstone,您可以在没有编译器支持的情况下实现完全动态跟踪。所以uftrace还是值得一试的。详细的官网PPT官网教程参考github主页