2019年6月18日, VxWorks

用于VxWorks的TraceAlyzer - 概述和入门指南

客人的博客

作者:Johan Kraft博士,Percepio的CEO和创始人

johankraft-percepio

Tracealyzer是一款面向嵌入式软件开发人员的跟踪可视化和分析工具。最近发布的Tracealyzer版本4VxWorks使开发人员对运行时行为有了前所未有的了解,从而减少了故障排除时间,提高了软件质量、性能和可靠性。

traceanalyzer不依赖于特殊的跟踪硬件,这意味着它甚至可以在开发实验室之外使用,例如在现场测试或作为部署系统中的飞行记录器。当开发人员试图捕获难以再现的罕见错误时,后一种模式特别有用。

Tracealyzer所做的不仅仅是显示记录的数据。它实际上理解VxWorks内核事件的含义,并利用这一点提供标准VxWorks跟踪的更高级的可视化。除了创新的跟踪视图之外,Tracealyzer还提供了其他几个视图,比如Communication Flow,这是一个显示任务和其他VxWorks对象在运行时如何交互的依赖关系图。另一个例子是Object Utilization视图,它显示了内核对象随时间的分配情况(例如,消息队列的大小)。所有这些视图都以直观的方式相互连接,只需双击一个数据点,就可以打开关注于同一数据点的相关视图,显示不同的透视图和抽象级别。例如,双击跟踪视图中的“msgQReceive”事件将打开Object History视图,显示该特定消息队列上的所有操作。通过不同抽象级别上的多个连接视图,您可以使用高级概览(如CPU Load Graph和Statistics Report)来发现异常,并轻松深入查看导致异常的详细事件。

Tracealyzer提供的复杂的可视化使得跟踪数据更易于访问和使用,允许开发人员加速调试和验证。

TraceAlyzer可以并排使用传统的调试工具,例如Wind River Workbench中可用的工具,并补充源代码调试器,在系统级别具有几个额外的观点,非常适合理解实时问题和罕见的异常,在其中经典源-code调试器不充分。

为VxWorks安装TraceAlyzer

通过注册下载Tracealyzer软件包percepio.com/download.并确保将VxWorks指定为目标平台。您还可以将免费,有限的评估许可证与下载一起申请。通过Percepio的经销商网络和其网站商店提供全额许可证。大学生和学术研究人员可以要求免费学术许可证。看percepio.com/licensing为更多的信息。

Tracealyzer是一个。net应用程序,它既可以在Windows上运行,也可以在Linux上运行,前提是安装了微软支持的开源。net框架Mono。大多数Linux发行版都包含Mono,也可以从Mono下载http://www.mono-project.com.我们建议使用编写v5.14时的Mono最新版本。有关进一步说明,请参见此FAQ条目与特定指令。

使用具有VxWorks的TraceAlyzer

用于VxWorks的TraceAlyzer与VxWorks跟踪库,WVLib的跟踪文件一起使用。这些迹线,存储在.wvr格式中,包含像上下文交换机和内核呼叫等内核事件,也可以使用WVLIB中的WVEVENT函数从应用程序代码中记录的“用户事件”。

2

VxWorks跟踪库在一个内部RAM缓冲区中缓冲跟踪数据,它可以保存到一个目标端文件(连续地或当跟踪停止时),或通过TCP套接字连续地传输。

要跟踪VxWorks系统,首先需要确保VxWorks映像项目已经配置为包括wvLib(风河系统查看器),并且它使用了高分辨率的时间戳驱动程序。

Tracealyzer包含一个用于VxWorks的小库(参见VxWorks文件夹中的Tracealyzer .c/.h),允许配置、启动和停止记录,也可以存储格式化的用户事件。这是集成VxWorks记录器的简化接口。在应用程序中包含tracealyzer.c和.h,并使用下面列出的函数来配置和控制跟踪。

使用TraceAlyzer库录制迹线的最简单方法是默认设置。在这种情况下,您只需调用Tzstart()即可在完成测试用例时开始录制和TZSTOP()。在默认设置中,跟踪在录制期间保存在RAM缓冲区中,并在调用TZSTOP时存储到目标设备上的文件(“tz.wvr”)。因此,迹线长度限于跟踪缓冲器的大小(默认为256 kB)。如果在调用tzstop之前缓冲区已满,则将覆盖旧事件。

状态tzStart (int traceLevel)
开始跟踪。参数" traceLevel "决定细节的级别,有效的选项是:

-TZ_TRACE_LEVEL_CONTEXT_SWITCH:只有上下文交换机(任务和ISR)。

-TZ_TRACE_LEVEL_TASK_STATE:添加任务状态更改(就绪等)。

-TZ_TRACE_LEVEL_OBJECT_AND_SYSTEM:所有细节(推荐)。

状态tzStop(空白)
停止跟踪,也可以存储跟踪,具体取决于存储配置(请参阅TzConfigStorage)。

STATUS tzEvent(char* channelName, char* formatStr,…)
存储格式化的用户事件(请参阅“跟踪应用程序代码与用户事件”)。

如果成功,所有函数返回0。

自定义跟踪配置

的函数tzConfigStorage ()tzconfigbuffer()可以选择在之前调用Tzstart.,以便应用自定义跟踪配置。

STATUS tzConfigStorage(int storageMode, int storageMethod, char* arg1, int arg2, int storeOnStop)
配置如何存储跟踪。

您可以省略配置呼叫;然后使用默认设置,对应于以下设置:

tz tzConfigStorage (TZ_MODE_DEFERRED TZ_METHOD_FILE。”wvr", O_CREAT |, 1)

storageMode参数的有效选项有:

  • tz_mode_continuous.(= 0):跟踪连续写入文件或套接字。
  • TZ_MODE_DEFERRED(= 1):跟踪在命令(tzStop)上存储。

storageMethod的有效选项包括:

  • TZ_METHOD_FILE(= 0):跟踪存储在目标文件系统上。
  • tz_method_socket.(= 1):跟踪通过TCP套接字上传到主机。Tracealyzer可以通过TCP套接字接收跟踪,但是从v4.2.12开始,VxWorks还不完全支持这种模式。我们打算尽快支持这一选择。

参数arg1和arg2取决于storageMethod的设置。

如果使用TZ_METHOD_FILE:

  • arg1应该是目标侧跟踪文件的路径
  • Arg2是文件打开属性/标志-应该是"O_CREAT | O_TRUNC

如果使用storageMethodtz_method_socket.

  • Arg1应该是接收跟踪信息的主机的地址。
  • arg 2应该是接收计算机的TCP端口

的参数storeOnStop仅当存储模式是TZ_MODE_DEFERRED.如果storeOnStop设置为1,呼叫tzStop还将将跟踪存储到指定的文件。

一些示例设置

对文件的持续跟踪。允许长跟踪。一直持续到tzStop被称为。
tz tzConfigStorage (TZ_MODE_CONTINUOUS TZ_METHOD_FILE。”wvr”O_WRONLY, 0)

延期跟踪文件。最新的事件保存在RAM环缓冲区中,并保存到文件时tzStop被称为。
tz tzConfigStorage (TZ_MODE_DEFERRED TZ_METHOD_FILE。”wvr”,O_CREAT | O_TRUNC, 1)

Tracealyzer可以通过TCP套接字接收跟踪,但是从v4.2.12开始,VxWorks还不完全支持这种模式。我们打算尽快支持这一选择。

STATUS tzConfigureBuffer(int bufferCount, int bufferSize)
配置跟踪缓冲区的大小(rBuff),用子缓冲区的数量和每个子缓冲区的大小表示。如果省略此调用,则使用缺省配置(4 × 64kb)。当对文件使用延迟跟踪时,这决定了跟踪的长度。当使用连续跟踪时,这个缓冲区大小可能会影响跟踪的最大吞吐量。

要查看生成的.wvr跟踪文件,选择file -> Open in Tracealyzer,或者简单地将文件拖到Tracealyzer主窗口。

有关VxWorks的TraceAlyzer库的更多详细信息,包括其他跟踪配置,请参阅代码文档tracealyzer.h.现在,我们推荐使用TZ_METHOD_FILE因为套接字模式在Tracealyzer 4.2中并不完全支持。请注意,您也可以使用Wind River Workbench记录跟踪,并在Tracealyzer中查看生成的.wvr文件。

用用户事件跟踪应用程序代码

VxWorks跟踪记录器(wvLib)允许您使用该函数存储应用程序的自定义事件wvevent()。这允许将二进制数据写入跟踪缓冲区。

STATUS wvEvent(event_t usrEventId, char* buffer, size_t bufSize)

TraceAlyzer可以显示这些事件,但默认情况下没有解释,并将它们显示为原始数据。但是,您可以使用用户事件解释(请参阅“视图”菜单)来设置用于在TraCeAlyzer中显示VxWorks事件的格式化规则。这允许TraCeAlyzer提取串和值,该字符串可以在用户事件信号图中绘制。

还有一种更简单的方法可以将格式化的日志消息添加到跟踪中—使用tzEvent()函数可以在Tracealyzer Library for VxWorks中找到。当使用tzEvent,没有必要使用本地wvEvents所需要的用户事件解释特性。

STATUS tzEvent(char* channelName, char* formatStr,…)

tzEvent函数提供了一个类似于经典printf的界面,但是实际的格式化是在Tracealyzer可视化中离线完成的tzEvent比打印机快多了。此外,与printf不同的是,您在Tracealyzer视图中获得可视化的信息,这允许您将事件与其他记录的事件关联起来,比如调度和系统调用。

的参数tzEvent()是:

  • ChannelName.:文本名称,指定事件的用户事件通道,允许轻松筛选用户事件。此名称显示在用户事件类别下的Filter视图中。
  • fmtstring.格式字符串允许文本和格式说明符,就像经典的printf一样,它允许你在字符串中嵌入数据参数。它不使用stdio格式,但支持来自printf的大多数常见格式说明符。详情请参见tracealyzer.h。
  • 数据参数:可选地,您可以包含可变数量的数据参数,如格式字符串指定。

示例使用

TzEvent(“调试”,“输入函数foo()”);

tzEvent(" U1", "U1: %lf v", voltage_u1);

tzEvent(“MyState”、“% s”,fsm1StateNames [newStateID]);

默认情况下,格式化的用户事件限制为256字节,它应该包含通道名称和格式化字符串(包括以空结束的字符串),任何数据参数和四个将事件标识为Tracealyzer格式化的用户事件的初始字节。这个限制可以通过调整来增加MAX_ARG_SIZE在TraceAlyzer.h中,但要注意您的应用程序将需要更多的堆栈空间。

VxWorks wvEvent函数对所有事件使用一个数字标识符。Tracealyzer不使用这个标识符格式化的用户事件,因此tzEvent为此使用一个常量(WVEVENT_ID),默认值为0。WVEVENT_ID在TraceAlyzer.h中定义,以防您希望更改此值,例如,避免与现有自定义事件发生碰撞。

为什么选择Tracealyzer ?

用于VxWorks的Tracealyzer使用与System Viewer相同的数据源,但提供了更强大的可视化功能,具有超过30个视图,以聪明的方式相互连接。

智能跟踪可视化:跟踪视图(图1)给出了所有记录事件的可视化时间轴,其中有许多用于筛选和可视化的选项。默认情况下,时间轴具有垂直方向,这使得它自然地以明文显示事件(例如VxWorks API调用),如事件标签.还可以以几种不同的方式对事件标签进行筛选,以将视图集中在最相关的事件上。

时间轴可以像本例中那样垂直呈现,也可以水平呈现;在这两种情况下,它的作用完全相同。

跟踪视图由视图字段字段可以单独添加、折叠、展开、重新排列和关闭,以便用户在任何时候都能关注最相关的信息。你甚至可以有多个相同类型的字段(例如调度),使用不同的设置和过滤器。

图1:主跟踪视图中的事件标签

图1:主跟踪视图中的事件标签

了解运行时依赖关系:系统调用,任务和其他内核对象之间的依赖性被修改并突出显示了TraceAlyzer。For instance, when selecting a “return from blocking” event (green label) the corresponding “blocking” event (red label) can be found using the “Go to Entry event” option, as shown below.

图2:查找相关事件

图2:查找相关事件

此外,图3中所示的通信流程图通过VxWorks服务提供了任务交互的依赖性图。这是从跟踪数据生成的,并且可以被视为记录的VxWorks API调用的摘要。这是系统运行时架构的非常有用的高级视图。双击图中的对象显示了对象历史记录视图中相应事件的列表。

图3:跟踪,通信流和对象历史视图

图3:跟踪,通信流和对象历史视图

集成数据绘图:Tracealyzer允许您将任何应用程序数据或事件记录为User Events,在跟踪视图中显示为黄色标签。任何数据参数都可以在User Event Signal Plot视图中绘制,如图4所示,单击一个数据点将使Tracealyzer在跟踪视图中突出显示相应的事件。这样就可以将数据与任务调度、中断、系统调用和其他事件关联起来。

图4:用户事件信号图

图4:用户事件信号图

集成内存使用视图:Tracealyzer提供了一个图,显示了随时间变化的动态内存分配,即malloc()和free()调用,如下图5所示。这允许您发现内存泄漏和过度的内存使用。在图的下面,您可以看到更详细的内存分配视图,其中显示了地址,malloc()调用可以与其对应的free()调用相匹配,以隔离所有剩余的分配,这使得更容易查明内存泄漏。因为两个内存视图都连接到跟踪视图,所以您可以很容易地找到并分析发现的任何问题的上下文。

图5:内存堆利用率

图5:内存堆利用率

有关详细信息,请联系support@percepio.com..我们很乐意提供在线演示帮助你开始使用您自己的工具和软件。这percepio.com对于新手和有经验的用户来说,Tracealyzer网站有很多关于如何充分利用Tracealyzer的资料。

以前的为什么虚拟化是应用可移植性的关键
下一个太空是最后的边界?模拟安全!