刚开始看指令流信息,还不太熟悉各个指令流表示的含义,这里做个记录
下面是用perf对一个简单的编译后的C程序进行的追踪结果
主体信息
上面都是16进制信息,先不用管
可以观察到每条指令流都由四部分组成,以分号作为分割(注意中间第三部分的时候他有冒号,但是不是分割)
真正追踪的时候从trace on
开始关注分许
- Idx:指令索引,一般是按时间顺序进行索引排序,故由小到大;这里只追踪指令跳转,故不是连续的)
- ID:事件标识符,先不用管(只关注后面的CID)
- 第三部分较长,是对事件的描述(可以理解为冒号前面是标识符,后面是具体的描述)
I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.
- I_ADDR_CTXT_L_64IS0: 事件标识符,用于表示特定类型的事件(在 CoreSight ETMV4I 追踪系统中,这个事件标识符可能代表 “Address & Context, Long, 64 bit, IS0”,即“地址和上下文,长格式,64位,IS0”)
- Address & Context: 这个事件涉及到某个地址和上下文的信息
- Long: 事件可能包含长格式的数据。
- 64 bit: 数据的位数,表示这个事件涉及到64位的信息。
- IS0: 可能表示与某种状态或配置相关的信息。
I_ATOM_F1 : Atom format 1
Atom 格式 1 类型的事件,Atom格式通常用于表示一些微观的操作或原子事件。在这个上下文中,“I_ATOM_F1” 是事件的标识符,而 “Atom format 1” 描述了事件的类型。
“Atom format 1” 具体表示什么,以及事件中包含的信息,需要查阅相关的 CoreSight ETMV4I 追踪系统的文档或规范。I_TIMESTAMP : Timestamp
件的描述,表明这是一个 “Timestamp” 类型的事件,与时间戳相关。后面事件记录中的具体信息,即表示时间戳的更新值
- 第四部分是事件记录的具体信息
- I_ADDR_CTXT_L_64IS0
- Addr表示事件记录中的具体信息,表示事件涉及的地址
- Ctxt: AArch64,EL0, NS;
提供有关上下文的信息,表示上下文是AArch64架构,ELO模式(特权级别为0),非安全状态; - CID=0x000010b6
CID即Contect ID,上下文信息.每个线程(Task)在执行时都有一个唯一的 Context ID,它用于在多任务环境中区分不同的执行上下文。
- I_ATOM_F1
- E:跳转(后面一条跟地址的话就是间接跳转,否则就是直接跳转,看objdump输出的信息去找怎么跳转的)
- N:表示一个空操作(不跳转)
(这里最好再看一下文档)
- I_TIMESTAMP
第四部分是Updated val ,表示时间戳的更新值,以便在后续的分析中了解事件之间的时间关系
- I_ADDR_CTXT_L_64IS0
Idx:421; ID:12; I_EXCEPT : Exception.; Data Fault; Ret Addr Follows;
Idx:423; ID:12; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000007FA3F3D3D8;
Idx:433; ID:12; I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0xFFFFFF8010082400; Ctxt: AArch64,EL1, NS;
Idx:443; ID:12; I_TIMESTAMP : Timestamp.; Updated val = 0x74dbf2bc835f
Idx:446; ID:12; I_TRACE_ON : Trace On.
Idx:448; ID:12; I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000007FA3F3D3D8; Ctxt: AArch64,EL0, NS; CID=0x000010b6;
Idx:462; ID:12; I_ATOM_F1 : Atom format 1.; N
Idx:870; ID:12; I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0x0000007FA3F3D1EC ~[0x1EC]
Idx:1240; ID:12; I_ADDR_MATCH : Exact Address Match., [0]; Addr=0x0000007FA3F4D810;
- Idx:421; ID:12; I_EXCEPT : Exception.; Data Fault; Ret Addr Follows;
在索引421处发生了一个异常事件。这是一个数据访问异常(Data Fault),并且后续会提供返回地址(Ret Addr Follows) - Idx:423; ID:12; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000007FA3F3D3D8;
事件类型为 “Address, Long, 64 bit, IS0”,即涉及64位长格式地址,上下文为 AArch64,IS0
事件的具体信息为地址(Addr),其值为0x0000007FA3F3D3D8。 - Idx:433; ID:12; I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0xFFFFFF8010082400; Ctxt: AArch64,EL1, NS;
- Idx:446; ID:12; I_TRACE_ON : Trace On.
在索引 446 处发生了一个事件,其事件类型为 “Trace On”,即追踪(Trace)被启用.
追踪通常用于记录程序执行过程中的一些关键事件或指令流,以便进行性能分析、调试或其他分析任务。当追踪开启时,系统会开始记录相关的追踪信息,以供后续分析使用。 - Idx:870; ID:12; I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0x0000007FA3F3D1EC ~[0x1EC]
在索引 870 处发生了一个事件,其事件类型为 “Address, Short, IS0”,即涉及短格式地址,上下文为 IS0;Addr是具体的地址信息,这是一个短格式的十六进制值; ~[0x1EC]: 附加的信息,可能是与地址相关的进一步描述,例如相对偏移等。
这种信息通常用于追踪程序的执行路径或者发现在某个特定地址发生的事件。 - Idx:1240; ID:12; I_ADDR_MATCH : Exact Address Match., [0]; Addr=0x0000007FA3F4D810;
I_ADDR_MATCH : 事件的标识符,表示这是一个关于地址匹配的事件
Exact Address Match., [0] : 事件的描述,指示这是一个精确地址匹配事件,表示某个特定的地址与预定义的地址完全匹配。而 “[0]” 则可能表示这是匹配的第一个地址
Idx:1467; ID:12; I_ATOM_F1 : Atom format 1.; N
Idx:1468; ID:12; I_ATOM_F2 : Atom format 2.; NE
- Atom Format 1 通常用于记录单个指令的微观层面事件。
它可能包含有关指令执行、访存和其他执行流信息的详细数据。
“N” 标记,可能表示某个时刻没有实际的操作发生,或者表示一个空操作。 - Atom Format 2 通常用于记录特殊条件或事件,例如异常、中断或其他与指令执行相关的非正常情况。
“NE” 标记,可能表示某个特定的非预期条件或事件,“NE” 可能表示 “Not Equal”,表示某种不相等的情况。
首部信息
这是 perf.data 文件中的一部分,其中包含关于性能计数器(perf events)的信息
- 0x1f8@perf.data [0x190]: event: 69
表示一个 perf event,事件编号为 69,发生地址为 0x1f8,大小为 400 字节。 - raw event: size 400 bytes
表示原始事件数据的大小为 400 字节。 - 0000: 45 00 00 00 00 00 90 01 0c 00 00 00 00 00 00 00
表示原始事件数据的具体内容,以十六进制表示。
这是 perf.data 文件中的一部分,其中包含关于性能计数器(perf events)的信息,特别是关于 PERF_RECORD_ID_INDEX 类型的记录。
- 第一行
表示一个 PERF_RECORD_ID_INDEX 类型的记录,发生地址为 0x1f8,大小为 400 字节(0x190 十六进制表示的大小)。
nr: 12 表示该记录中有12个 ID(标识符)条目 - 后面是ID条目
- id:id值
- idx:索引
- cpu:该ID所属的CPU序号
- tid:线程ID
结尾信息
0x1a560@perf.data [0x8]: event: 68
.
. ... raw event: size 8 bytes
. 0000: 44 00 00 00 00 00 08 00 D.......
-1 -1 0x1a560 [0x8]: PERF_RECORD_FINISHED_ROUND: unhandled!
Aggregated stats: (excludes AUX area (e.g. instruction trace) decoded / synthesized events)
TOTAL events: 28
COMM events: 2 ( 7.1%)
EXIT events: 1 ( 3.6%)
MMAP2 events: 4 (14.3%)
AUX events: 2 ( 7.1%)
ITRACE_START events: 2 ( 7.1%)
SWITCH events: 7 (25.0%)
ATTR events: 2 ( 7.1%)
FINISHED_ROUND events: 1 ( 3.6%)
ID_INDEX events: 1 ( 3.6%)
AUXTRACE_INFO events: 1 ( 3.6%)
AUXTRACE events: 2 ( 7.1%)
THREAD_MAP events: 1 ( 3.6%)
CPU_MAP events: 1 ( 3.6%)
FINISHED_INIT events: 1 ( 3.6%)
这是 perf.data 文件中的一部分,其中包含了关于性能计数器 (perf events) 的信息。
- 0x1a560@perf.data [0x8]: event: 68
表示一个 perf event,事件编号为 68,发生地址为 0x1a560,大小为 8 字节。 - raw event: size 8 bytes
表示原始事件数据的大小为 8 字节 - 0000: 44 00 00 00 00 00 08 00
表示原始事件数据的具体内容,以十六进制表示 - -1 -1 0x1a560 [0x8]: PERF_RECORD_FINISHED_ROUND: unhandled!
表示一个 PERF_RECORD_FINISHED_ROUND 类型的记录,但是目前还没有处理它。这可能是因为在解析 perf 数据时发现了某个记录类型,但当前的处理程序不支持该记录类型。 - Aggregated stats:表示性能事件的汇总统计信息。
- TOTAL events:总事件数
- 后面是具体的事件类型和数量,每个事件都附带了他在总事件数中的百分比