tprof_在tprof中将符号信息解析为有意义的函数名称

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命令
离线自动处理 使用dbxgensyms命令
后期处理 使用dbxgensyms命令

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

  • 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解析地址:

  1. 使用dbx作为受调试者运行以下命令。
    # dbx ./ryes 
    				      Type 'help' for help. 
    				      reading symbolic information ...warning: no source compiled with -g.
  2. 使用dbxlisti子命令获取地址信息。
    (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

  3. 使用.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

使用dbxlisti子命令,从.lst文件中获取指令的行号。

  1. 使用dbx中的listi子命令获取指令的偏移量。
    (dbx) listi 0x1000039C
    				0x1000039c (testfunc+0x1c) 80610044 lwz r3,0x44(r1)

    listi子命令的输出(testfunc+0x1c) ,您可以看到指令的偏移量是0x1c 。 此偏移量用于标识源文件中代码的行号。

  2. 从.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
  3. 获取行号。

    通过将指令的偏移量添加到函数的起始地址,我们得到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解析符号:

  1. 使用gensymsryes过程收集符号。
    gensyms -k /unix -s -b ./ryes > ryes.syms
  2. 运行tprof以对跟踪文件进行后期处理。
    tprof -ukes -r ryes

    报告文件摘录

    用户流程
    =============
    ./黑麦
    配置文件:./ ryes

    =====
    72.68

    所有进程的总百分比(./黑麦)= 72.68

    子程序
    ==========
    .testfunc
    .testfunc1


    ======
    36.62
    36.05

    资源
    ======
    黑麦
    黑麦

收集跟踪以进行tprof后处理

执行以下步骤来收集tprof中后处理模式所需的跟踪文件。

  1. 运行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
  2. 使用以下命令打开跟踪收集:
    trcon
  3. 运行工作负载。
  4. 使用以下命令停止跟踪收集。
    trcstop
  5. 使用以下命令为过程生成符号。
    gensym -k -s -b ./ryes > ryes.syms
  6. 使用以下命令后处理跟踪文件。
    tprof -ukes -r ryes

相关话题

请参阅IBM知识中心,以获取有关以下命令的信息:


翻译自: https://www.ibm.com/developerworks/aix/library/au-aix-resolve-symbol-info/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值