tprof是一个命令行实用程序,提供了识别和分析性能瓶颈的功能。 tprof实用程序使用tprof实用程序运行给定的工作负载,并指定在每个流程中花费的时间,并在每个流程中指定每个子例程中花费的时间。 本文介绍了用户可以使用gensyms和dbx命令将tprof配置文件报告中的未解析地址转换为有意义的函数地址的方法。
tprof命令可以在以下模式下运行:
当使用不带-A标志的-x标志运行tprof时, tprof以实时模式运行。 在这种模式下, tprof在后台启动AIX跟踪实用程序,并在生成跟踪数据时对其进行处理。
当正在分析的程序结束时, tprof收集符号信息并生成分析报告。 在此模式下, tprof不会生成其他文件。
注意 :符号是目标文件中变量和函数的地址。
当tprof与运行-x标志和-A标志, tprof在自动脱机模式下运行。 在这种方式下, tprof启动AIX跟踪实用程序并将跟踪数据记录到文件中。 收集跟踪数据后,还将收集符号信息并将其写入符号文件。 tprof从日志文件中读取数据并处理该数据以生成报告。 在这种模式下, tprof生成.syms和.trc文件。 这些文件可用于后期处理。
在这种模式下, tprof post处理.trc和.syms文件。 .trc和.syms文件可以在自动脱机模式下运行tprof时生成,也可以使用trace and gensyms命令生成。 tprof通过对所需文件进行后处理来生成配置文件报告。
tprof从二进制文件中读取符号,以将IAR解析为易于理解的函数名称。 在自动脱机模式下,此信息保存在.syms文件中。 在某些情况下, tprof无法将IAR(地址)解析为人类可读的函数名,例如,当未导出二进制路径时, tprof无法解析地址,而是在报告中以十六进制值显示地址。
下表提供了有助于解决生成的报告中的十六进制值的方法。
满足以下先决条件才能解决符号信息:
dbx知识 了解在编译过程中生成.lst文件的知识测试二进制代码示例
void testfunc() { for(int i = 0; i < 10000000; i++); } void testfunc1() { for(int i = 0; i < 10000000; i++); } int main() { while(1) { testfunc(); testfunc1(); } }作为测试的一部分,示例代码将被编译并放置在/home/tproftest . 二进制文件是从同一位置运行的。
tprof从其他位置运行,例如/home/tproftest/reports 。
使用以下参数运行tprof命令:
tprof -ukes -x sleep 30sleep.prof专家( tprof生成的报告)
摘要部分
处理 ======= 频率 ==== 总 ===== 核心 ====== 用户 ==== 共享 ====== 其他 ===== ./黑麦 2 72.77 0.10 72.68 0.00 0.00从报告中,我们可以了解到有两个运行的ryes进程实例。 对于30秒收集的样本,两个实例的组合处理器利用率约为72.77%。 在72.77%中,0.10%是内核,而72.77%是用户空间。
每个流程报告
处理部分
处理 ======= PID ==== 工业贸易署 ===== 总 ===== 核心 ====== 用户 ==== 共享 ====== 其他 ===== ./黑麦 11141484 30736841 36.47 0.00 36.47 0.00 0.00 ./黑麦 7406066 17760629 36.31 0.10 36.21 0.00 0.00用户空间报告
用户流程 ============= /黑麦72.68 % ====== 72.68 配置文件:./ ryes 所有进程的总百分比(./黑麦)= 72.68 子程序 ========== <0x1000039C> <0x10000400> <0x100003FC> <0x100003B0> <0x100003A0> <0x1000040C> <0x100003A8> <0x100003AC> <0x100003A4> <0x10000404> <0x10000408> % ====== 34.67 18.08 17.74 0.94 0.79 0.17 0.09 0.07 0.07 0.05 0.01 资源 ======在此报告中,可以看到ryes进程没有解析任何地址,用户可以使用dbx和。 lst文件解析地址。
注意: •仅当未去除符号时,这些步骤才有用。 •作为示例,仅考虑两个IAR。执行以下步骤来使用dbx解析地址:
使用dbx作为受调试者运行以下命令。 # dbx ./ryes Type 'help' for help. reading symbolic information ...warning: no source compiled with -g. 使用dbx的listi子命令获取地址信息。 (dbx) listi 0x1000039C 0x1000039c (testfunc+0x1c) 80610044 lwz r3,0x44(r1) (dbx) listi 0x100003FC 0x100003fc (testfunc1+0x1c) 80610044 lwz r3,0x44(r1)dbx显示0x100003fc解析为偏移量为0x1c testfunc ,而0x100003fc解析为偏移量为0x1c testfunc1 。
使用.lst文件标识源文件中给定地址的行号.lst文件的摘录
源文件部分
>>>>> SOURCE SECTION <<<<< 1 | 2 | void testfunc() { 3 | for(int i = 0; i < 10000000; i++); 4 | 5 | } 6 | 7 | 8 | void testfunc1() { 9 | for(int i = 0; i < 10000000; i++); 10 | 11 | } 12 | 13 | int main() { 14 | while(1) { 15 | 16 | testfunc(); 17 | 18 | testfunc1(); 19 | } 20 | 21 | 22 | 23 | }功能testfunc
| 000000 PDEF testfunc 2| PROC 0| 000000 stwu 9421FFB0 1 ST4U gr1,#stack(gr1,-80)=gr1 0| CL.13: 3| 000004 addi 38600000 1 LI gr3=0 3| 000008 stw 90610044 1 ST4A i(gr1,68)=gr3 3| 00000C addis 3C800099 1 LIU gr4=153 3| 000010 addi 38849680 1 AI gr4=gr4,-27008 3| 000014 cmpw 7C032000 1 C4 cr0=gr3,gr4 3| 000018 bc 40800020 1 BF CL.17,cr0,0x1/lt, 3| CL.16: 3| 00001C lwz 80610044 1 L4A gr3=i(gr1,68) 3| 000020 addi 38630001 2 AI gr3=gr3,1 3| 000024 stw 90610044 1 ST4A i(gr1,68)=gr3 3| 000028 addis 3C800099 1 LIU gr4=153 3| 00002C addi 38849680 1 AI gr4=gr4,-27008 3| 000030 cmpw 7C032000 1 C4 cr0=gr3,gr4 3| 000034 bc 4180FFE8 1 BT CL.16,cr0,0x1/lt, 3| CL.17: 5| 000038 b 48000004 0 B CL.18,-1 5| CL.14: 5| CL.18: 5| 00003C addi 38210050 1 AI gr1=gr1,80 5| 000040 bclr 4E800020 0 BA lr函数testfunc1
| 000000 PDEF testfunc1 8| PROC 0| 000060 stwu 9421FFB0 1 ST4U gr1,#stack(gr1,-80)=gr1 0| CL.7: 9| 000064 addi 38600000 1 LI gr3=0 9| 000068 stw 90610044 1 ST4A i(gr1,68)=gr3 9| 00006C addis 3C800099 1 LIU gr4=153 9| 000070 addi 38849680 1 AI gr4=gr4,-27008 9| 000074 cmpw 7C032000 1 C4 cr0=gr3,gr4 9| 000078 bc 40800020 1 BF CL.11,cr0,0x1/lt, 9| CL.10: 9| 00007C lwz 80610044 1 L4A gr3=i(gr1,68) 9| 000080 addi 38630001 2 AI gr3=gr3,1 9| 000084 stw 90610044 1 ST4A i(gr1,68)=gr3 9| 000088 addis 3C800099 1 LIU gr4=153 9| 00008C addi 38849680 1 AI gr4=gr4,-27008使用dbx的listi子命令,从.lst文件中获取指令的行号。
使用dbx中的listi子命令获取指令的偏移量。 (dbx) listi 0x1000039C 0x1000039c (testfunc+0x1c) 80610044 lwz r3,0x44(r1)从listi子命令的输出(testfunc+0x1c) ,您可以看到指令的偏移量是0x1c 。 此偏移量用于标识源文件中代码的行号。
从.lst文件获取函数的起始地址从.lst文件的功能testfunc的摘录中,您可以注意到testfunc的起始地址为000000 。
| 000000 PDEF testfunc 2| PROC 0| 000000 stwu 9421FFB0 1 ST4U gr1,#stack(gr1,-80)=gr1 0| CL.13: 3| 000004 addi 38600000 1 LI gr3=0 获取行号。通过将指令的偏移量添加到函数的起始地址,我们得到0x1c ,它映射到.lst文件中的以下内容。
3| 00001C lwz 80610044 1 L4A gr3=i(gr1,68)在上面的代码“ 3”是指.lst文件的源部分中的行号。
同样, 0x100003FC映射到源文件的第9行testfunc1。
9| 00007C lwz 80610044 1 L4A gr3=i(gr1,68)除了.prof文件之外, tprof的-A选项还会生成.trc和.syms文件。 通过使用gensyms为给定的二进制文件重新生成缺少的符号,您可以将未解析的符号解析为有意义的函数名称。
执行以下步骤来使用gensyms解析符号:
使用gensyms为ryes过程收集符号。 gensyms -k /unix -s -b ./ryes > ryes.syms 运行tprof以对跟踪文件进行后期处理。 tprof -ukes -r ryes报告文件摘录
用户流程 ============= ./黑麦 配置文件:./ ryes % ===== 72.68 所有进程的总百分比(./黑麦)= 72.68 子程序 ========== .testfunc .testfunc1 % ====== 36.62 36.05 资源 ====== 黑麦 黑麦执行以下步骤来收集tprof中后处理模式所需的跟踪文件。
运行trace命令。 /usr/bin/trace -ad -M -L 402366873 -T 500000 -j 00A,001,002,003,38F,005,006,134,210,139,5A2,5A5,465,234,5D8 -o ryes.trc或者,运行以下命令以获得相同的结果。
/usr/bin/trace -ad -M -L 402366873 -T 500000 -J tprof -o ryes.trc 使用以下命令打开跟踪收集: trcon 运行工作负载。 使用以下命令停止跟踪收集。 trcstop 使用以下命令为过程生成符号。 gensym -k -s -b ./ryes > ryes.syms 使用以下命令后处理跟踪文件。 tprof -ukes -r ryes请参阅IBM知识中心,以获取有关以下命令的信息:
tprof 跟踪 基因符号 dbx翻译自: https://www.ibm.com/developerworks/aix/library/au-aix-resolve-symbol-info/index.html
相关资源:微信小程序源码-合集6.rar