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知识中心,以获取有关以下命令的信息:
翻译自: https://www.ibm.com/developerworks/aix/library/au-aix-resolve-symbol-info/index.html