tprof

    技术2024-07-04  97

    tprof是一个命令行实用程序,提供了识别和分析性能瓶颈的功能。 tprof实用程序使用tprof实用程序运行给定的工作负载,并指定在每个流程中花费的时间,并在每个流程中指定每个子例程中花费的时间。 本文介绍了用户可以使用gensyms和dbx命令将tprof配置文件报告中的未解析地址转换为有意义的函数地址的方法。

    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无法解析地址,而是在报告中以十六进制值显示地址。

    下表提供了有助于解决生成的报告中的十六进制值的方法。

    表1. tprof模式
    模式 方法 实时或在线 使用dbx命令 离线自动处理 使用dbx和gensyms命令 后期处理 使用dbx和gensyms命令

    满足以下先决条件才能解决符号信息:

    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 。

    使用dbx的实时/联机模式地址解析

    使用以下参数运行tprof命令:

    tprof -ukes -x sleep 30

    sleep.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后处理

    执行以下步骤来收集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
    Processed: 0.021, SQL: 9