第 3 章 - Azure RTO TraceX 的说明

本章介绍 Azure RTO TraceX 系统分析工具的整体功能,其中包括其 GUI 的整体功能。

显示概述

图 4 显示了 TraceX 系统分析工具的主显示窗口。 其布局非常简单,执行上下文用左侧的垂直元素表示;例如,初始化、中断、空闲和各种线程条目。 每个上下文中发生的事件在同一个上下文行上水平显示。 例如,下面显示的 QR 事件显示“线程 2”正在对 tx_queue_receive 进行连续调用。

TraceX 系统分析工具的主显示窗口的屏幕截图。

图 5

上下文变化用连接上下文行的黑色竖线表示。 当前选定的事件用红色实竖线表示。 在此例中,选择了事件 494。

标题栏

TraceX 标题栏提供了一些有用的信息。 第一个是 TraceX 的当前版本。 第二个是当前打开的跟踪文件的完整路径。 图 6 中的示例显示了 TraceX 6.0.0 版本正在显示 demo_threadx.trx 跟踪文件。

TraceX 标题栏的屏幕截图。

图 6

工具栏

TraceX 工具栏提供了几个用于打开跟踪文件及其显示控制元素的按钮。

TraceX 工具栏的屏幕截图。

图 7

TraceX 工具栏按钮(从左到右)的定义如下:

Button Function
“打开跟踪文件”按钮 打开跟踪文件
“打开用户指南”按钮 打开此用户指南
“生成执行配置文件”按钮 生成执行配置文件
“生成性能统计信息”按钮 生成性能统计信息
“生成线程堆栈使用情况”按钮 生成线程堆栈使用情况
“显示所选事件”按钮 显示当前选择的事件
“搜索”按钮 搜索事件
“放大”按钮 放大。
显示缩放按钮 选择显示缩放的百分比,其中 100% 表示在当前视图中显示整个跟踪文件。
“缩小”按钮 缩小。
“选择第一个事件”按钮 选择第一个事件。
“显示上一个事件页”按钮 显示上一个事件页。
“显示上一个事件”按钮 显示上一个事件。
下一个/上一个导航按钮 确定下一个/上一个导航按钮的操作方式。 如果选择了“事件”,则会对下一个/上一个事件进行导航。 如果选择了“上下文”,则在指定上下文的下一个/上一个事件上完成导航。 如果选择了“对象”,则在指定对象的下一个/上一个事件上完成导航,例如,与特定队列相关的事件。 如果选择了“切换”,则在上下文中的下一个/上一个更改上完成导航。 如果选择了“ID”,则在指定事件 ID 的下一个/上一个事件上完成导航。
“显示下一个事件”按钮 显示下一个事件。
“显示下一个事件页”按钮 显示下一个事件页。
“选择上一个事件”按钮 选择上一个事件。

“显示模式”选项卡

TraceX 以两种不同的方式显示系统事件:“顺序”和“时间相对”。 默认模式为顺序模式,即图 8 所显示的模式。

若要改模式,方法非常简单,只需在 TraceX 窗口中选择“顺序视图”或“时间视图”选项卡即可。 图 8 显示了“顺序视图”和“时间视图”选项卡

“顺序视图”和“时间视图”选项卡的屏幕截图。

图 8

顺序视图模式

选择图 8 所示的“顺序视图”选项卡便选择了顺序视图模式。 这是默认模式。 在此模式下,各事件相互紧邻显示,系统不会考虑这些事件之间经过的时间。 另请注意图 8 中显示区域上方的标尺。 该标尺会显示始于跟踪的相关事件号。

此模式是默认模式,有助于大致了解系统的运行情况。

时间视图模式

选择“时间视图”按钮便选择了时间视图模式。 图 9 显示了与图 8 相同的事件跟踪(时间视图模式除外)。 在此模式下,系统将按照与时间相关的方式显示事件,并用绿色实心条显示各事件之间的执行状况。 此模式可用于查看系统中执行大量处理的位置,这有助于开发人员优化其系统,从而获得更好的性能和/或响应能力。

“时间视图”选项卡的屏幕截图。

图 9

另请注意图 9 中事件显示区域上方的标尺。 此标尺显示了始于跟踪的相对时钟周期,此周期派生自在 ThreadX 内事件跟踪日志记录中检测的时间戳。 如果时间戳相隔太近(低频计时器),这些事件将同时发生。 反之,如果时间戳相隔太远(高频计时器),这些事件将相隔很久发生。 选择频率正确的时间戳是使时间相对视图有意义的一个重要考虑因素。

系统摘要行

TraceX 还提供了一个摘要行(图 10 中的顶部上下文),其中包含同一行中的所有事件。 这样即可轻松查看复杂系统的概述。 在包含多个线程的系统中,摘要栏的作用更为明显。 如果没有此类摘要行,则必须使用垂直滚动条跟进复杂的系统交互,从而跟进执行的上下文。

“顺序视图”选项卡中系统摘要行的屏幕截图。

图 10

摘要行包含上下文摘要其及下面相应的事件摘要。 在图 10 所示的示例中,很容易看到“线程 2”在执行时被中断。 中断导致“线程 3”、“线程 6”、“线程 4”和“线程 7”发生抢占,在此之后,“线程 2”恢复执行

系统上下文

TraceX 在屏幕左侧列出了系统上下文,如图 11 所示。 在特定上下文中发生的事件将显示在该上下文右侧的水平行中。 通过这种方式,可以轻松确定事件发生的上下文,并跟进该上下文行,从中查看特定上下文中发生的所有事件。

前两个上下文条目始终是“中断”和“初始化/空闲”上下文。 Interrupt 上下文表示由中断服务例程 (IRS) 产生的所有系统事件。 Initialize/Idle 上下文表示 ThreadX 中的两个上下文。 在 tx_application_define 执行期间发生的事件是“初始化/空闲”上下文。 如果系统处于空闲状态,并因此没有发生任何事件,则时间视图中表示“正在运行”的绿色条将绘制在“初始化/空闲”上下文中。

屏幕左侧的系统上下文的屏幕截图。

图 11

在图 11 的示例中,有 9 个线程上下文(从“系统计时器线程”上下文开始)。 通过将鼠标悬停在单个上下文上,可以获得有关该上下文的其他信息。 这些其他信息包括跟踪期间线程的起始堆栈地址、结束堆栈地址、总大小、已用百分比、相对执行百分比、挂起数、恢复数以及最高优先级和最低优先级。 图 12 显示了“线程 0”的信息

Thread 0 的信息的屏幕截图。

图 12

还可以移动上下文以对更感兴趣的信息进行分组。 此操作可通过拖放上下文或右键单击上下文来实现。 右键单击上下文会生成一个对话框,可在其中将上下文移到顶部或底部。

如果选择“移到顶部”,则会将“线程 3”上下文移到上下文列表的顶部,如图 13 所示。

将移至上下文列表顶部的上下文的屏幕截图。

图 13

线程状态信息

启用后,TraceX 会在线程的上下文中用彩色线条显示每个线程的状态。 绿线表示线程处于“就绪”状态,而任何其他颜色的线条表示该线程已挂起。 对于挂起的线程,线条的颜色表示挂起该线程的 ThreadX 对象的类型。 例如,在图 13 中,从事件 147 开始的“系统计时器线程”上下文中的绿线显示“系统计时器线程”已准备就绪。 在事件 147 之前和事件 154 之后,缺少绿线表示“系统计时器线程”已准备就绪。 在事件 147 之前和事件 154 之后,缺少绿线表示“系统计时器线程”已挂起。

在线程上下文中用彩色线条表示每个线程状态的屏幕截图。

图 14

线程状态显示模式有三种,可通过“选项”->“状态行”菜单来使用。 “仅限就绪”选项仅显示就绪(绿色)状态行,但不显示任何挂起状态行。 这是 TraceX 的默认选项。 “全部开启”选项可用于显示所有状态行(就绪和挂起)。

最后,“全部关闭”选项可用于取消显示所有状态行。

事件信息显示

TraceX 提供了大约 600 个运行时事件的详细信息,包括 ThreadX、FileX、NetX、NetX Duo 和 USBX API 调用和内部事件。 TraceX 还支持多达 61,439 个唯一的用户定义事件。

无论是选择顺序显示模式还是时间显示模式,在显示区域的任何事件上悬停鼠标都会在事件附近显示详细的事件信息。 图 15 显示了将鼠标悬停在演示 demo_threadx.trx 跟踪文件中的事件 143 上的情形:

将鼠标悬停在示例跟踪文件中的事件 143 上的屏幕截图

图 15

显示的每个事件都包含有关“上下文”以及“相对时间”和“时间戳”的标准信息。 “上下文”字段显示事件发生的上下文。 正好有四种上下文:线程、空闲、ISR 和初始化。 在线程上下文中发生事件时,将收集并显示此时的线程名称及其优先级,如上所示。 “相对时间”显示从跟踪开始的计时器时钟周期的相对数量。 “原始时间戳”显示事件的原始时间源。 最后,显示所有特定于事件的信息。 本章的剩余部分将详细介绍此信息。

还可以通过双击任何事件来获取详细的事件信息。 图 16 显示了双击事件 143:

双击事件时显示事件详细信息的屏幕截图。

图 16

用户可以同时查看多个事件,因此能够通过内容更丰富的视图了解发生的情况。 由于许多事件彼此相关,因此并排查看这些事件非常有用。 可通过双击多个事件来完成此操作。

显示当前事件

当用户通过“视图”->“当前事件”或单击工具栏上的“当前事件”按钮选择时,TraceX 会在单独的窗口中显示当前事件。 选择之后,TraceX 会在单独的窗口中显示当前选择的事件,并在每次选择另一个事件时刷新此窗口。

事件搜索

TraceX 提供了多种事件搜索功能。 每个事件的事件 ID 和信息字段都是主要的搜索参数。 如果不指定搜索参数的值,则表示将从搜索中有效删除该参数。 此外,还可以执行搜索,以使找到的任何参数都满足搜索条件,或必须找到所有参数才能满足搜索条件。 搜索时也可以限制在特定的上下文中搜索或涵盖跟踪中的所有上下文。 选择工具栏上的“按值搜索”按钮可调用事件搜索,如图 17 所示。 选中此选项时,将显示“搜索”对话框,可在其中指定搜索的所有参数。 然后,可以使用“搜索”对话框中的“下一个”和“上一个”按钮查找与指定搜索条件匹配的下一个和上一个事件。 图 17 显示了搜索对话框。

事件搜索的屏幕截图。

图 17

搜索对话框的屏幕截图。

图 18

放大和缩小

默认情况下,TraceX 将按其完整大小显示事件。 你可以根据需要放大或缩小。 缩小在查看跟踪中捕获的整体事件时非常有用,而放大在因解析时间戳源而发生事件重叠的情况下很有用。 图 19 显示 demo_threadx.trx 文件已缩小,因此显示了完整的跟踪文件。

缩小示例文件以显示完整跟踪文件的屏幕截图。

图 19

按照 100% 的比例缩小以在当前显示页面上显示整个跟踪时,可以轻松查看跟踪中捕获的所有上下文执行以及这些上下文中发生的常规事件。 请注意,在图 16 中,“线程 1”和“线程 2”最常执行。 这些线程的事件用蓝色显示还表明它们正在发出队列服务调用(队列事件为蓝色)。

还原为完整的图标视图同样简单;可以重复选择“放大”按钮,也可以输入 100 的系数。

事件之间的时钟周期增量

确定 TraceX 中各种事件之间的时钟周期数非常简单,只需单击开始事件,并将鼠标拖动到结束事件。 事件之间的时钟周期增量在屏幕的右上角显示,如图 17 所示。

事件之间的时钟周期增量的屏幕截图。

图 17

图 17 所示的增量时钟周期显示,事件 125 和事件 154 之间已经过 5032 个时钟周期。 这个值还可以通过查看每个事件中的相对时间戳然后相减来手动计算,但使用 GUI 会非常方便快捷。

显示实际时间

启用后,TraceX 将在“时间视图”中显示实际时间(以微秒为单位)和各种增量时间信息。 默认情况下,系统会禁用实际时间显示功能。 若要启用实际时间显示,必须通过“选项”->“每微秒的时钟周期数”输入每个微秒的时钟周期数(要输入的值由目标上用于 TraceX 事件日志记录的硬件计时器源决定)。

优先级倒置

TraceX 会自动显示在跟踪文件中检测到的优先级倒置。 优先级倒置指的是,较高优先级的线程在获取现在由较低优先级线程所拥有的互斥锁时,会被阻塞的情况。 我们将这样的情况称为“确定性”情况,因为系统已设置为以这种方式运行。 为了通知用户,TraceX 会用浅橙红色显示“确定性”优先级倒置范围。

TraceX 还会显示“非确定性”优先级倒置。 这些优先级倒置与“确定性”优先级倒置的不同之处在于,在“确定性”优先级倒置期间执行了具有不同优先级的另一个线程,因此使得优先级倒置的时间具有“非确定性”。 用户通常不知道这种情况,这可能非常严重。 为了提醒用户存在此情况,TraceX 用更亮的橙红色显示“非确定性”优先级倒置。 图 18 显示了“确定性”和“非确定性”优先级倒置。

跟踪文件中的优先级倒置的屏幕截图。

图 18

图 18 显示了从事件 398 到事件 402 的“确定性”优先级倒置。 在此范围内,较高优先级的“线程 0”因为归较低优先级的“线程 1”所有的互斥锁而被阻塞。 在事件 402 中,“线程 1”释放互斥锁,因此结束了优先级倒置

较亮的阴影区域显示事件 408 到事件 420 之间的“非确定性”优先级倒置。 造成这种“非确定性”的原因是,虽然“线程 1”占有阻止了较高优先级“线程 0”的互斥锁,但此时发生了中断,“线程 2”得到恢复,随后系统执行该线程,从而延长了系统处于优先级倒置的时间。 这种情况可能很严重并且难以识别;但 TraceX 却可以轻松识别。