首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

如何编写跟踪格式条目--结构介绍

如何编写跟踪格式条目--结构介绍

本帖最后由 look_w 于 2018-1-8 09:34 编辑

简介跟踪是最常用的调试技术之一。它向用户提供了出现问题之前发生的行为的信息。为了做到这一点,开发人员需要在代码中放置一些跟踪钩子(trace hook)。每次运行包含跟踪钩子的代码路径时,这些跟踪钩子都会记录必要的数据。这些跟踪钩子记录的数据均采用二进制格式,然后通过用户定义的规范进行格式化和呈现,以便进行分析。因为跟踪点和跟踪数据是固定的,这种类型的跟踪被称为静态跟踪。静态跟踪可分为两类:系统跟踪和组件跟踪。对于系统跟踪,我们使用一个通用的全局内核缓冲器来保存跟踪记录(traces)。然而,在组件跟踪中,我们使用组件缓冲器来保存来自特定组件的跟踪记录。组件跟踪可以提供细粒度的灵活性,可根据需要控制个别组件的跟踪行为。跟踪报告生成工具可以使用跟踪格式文件指定的条目,将来自跟踪点的原始数据转换为可读的格式。
本文将重点介绍跟踪格式条目,包含语法、各种构造(constructs)等内容。本文结尾部分将通过一个示例展示一些常用的构造。   
钩子标识符为了惟一地标识每个跟踪点和数据,每个跟踪点都有一个相关联的标识符。通过使用这些标识符,跟踪报告生成工具将在跟踪格式文件中查找跟踪格式条目。为了管理这些数量庞大的标识符,引入了子钩子标识符(subhook identifier) 的概念。每个组件可以分配一个父钩子标识符,这个标识符在所有组件中是惟一的。它的后面可以附加一些子钩子标识符,这些标识符在组件内部有效,可以在组件层面随意使用。  
用于跟踪的应用编程接口(API)开发人员可以使用多种 API 为其代码编写跟踪数据。非泛型跟踪 API 需要编写固定长度(0 到 5 个数据字)的数据,其中每个数据字在 32 或 64 位环境下为 8 或 16 字节。泛型跟踪 API 使用户能够跟踪可变长度的数据。请参阅  部分,详细了解系统跟踪 API。  
跟踪条目的结构跟踪条目的结构包括以下几个部分:
  • 起始部分:Hookword(包括钩子 ID、标志和子钩子 ID)
  • 结尾部分:线程 ID,时间戳(64 位情况下还包括可选的处理器 ID)
  • 中间部分:0 到 5 个数据字,被符号化为 D1、D2、D3、D4 和 D5
非泛型跟踪结构的示例:
1
Hookword | [ D1|D2|D3|D4|D5 ] | Thread ID|Timestamp




泛型跟踪结构的示例:
1
Hookword| D1 | Variable_length_data | Thread ID | Timestamp




样例 C 程序:
1
2
3
4
5
6
7
8
9
10
11
12
#include <sys/types.h>
#include <sys/trchkid.h>
#include <stdio.h>

#define HKWD_CUSTOM 0x01000000
main()
{
int *i;
i=malloc(sizeof(int)*10);
/* logs a trace entry with 3 datawords passed as argument after HKWD_CUSTOM */
TRCHKL3(HKWD_CUSTOM,sizeof(int),i,10);
}




编译上述程序:
1
/usr/vac/bin/cc -q64 -g myc.c -l rts




运行上述程序:
1
trace -aj 010 ; ./a.out ; trcstop




命令输出:
1
2
3
4
5
ID  ELAPSED_SEC DELTA_MSEC  APPL    SYSCALL KERNEL  INTERRUPT
010 0.005312869 5.312869    UNDEFINED TRACE ID idx 0x1fc28
                    traceid 0100 hookword  8000002801000000 type 8000
                    hookdata 0000 0000000000000004
                    00000001100008D0 000000000000000A




被跟踪的数据用十六进制格式输出,除了 hookword、类型和钩子数据之外,很难识别哪个十六进制字表示哪些内容。这种数据形式难以进行分析,因为您需要知道这些数据字对应的内容并记住每个跟踪条目的这些内容。为了解决这个问题,跟踪基础架构为用户提供了一个可以定义他们自己的跟踪格式条目的工具。例如,如果上述输出用以下格式出现,那么可以更加容易地利用它们。
1
2
ID  ELAPSED_SEC DELTA_MSEC  APPL    SYSCALL KERNEL  INTERRUPT
010 0.005312869 5.312869    Single Unit:0004 Address:1100008D0 Count:000A




为了提供子钩子 ID,用户可以使用逻辑 “或” 操作符 ("|") 将子钩子 ID 附加到钩子 ID,如下面示例所示:
1
2
#define FIRST_SUBHOOK 0x01
TRCHKL3(HKWD_CUSTOM | FIRST_SUBHOOK,sizeof(int),i,10);

返回列表