使用 Linux Trace Toolkit ng (LTTng) 创建实时 ArduPilot 跟踪器

本文将介绍如何使用 LTTng 用于为在 Linux 电路板上运行的 ArduPilot 创建运行时跟踪(仅限)。

概述

跟踪是一种用于记录内存中软件的实时行为并离线分析代码执行情况的技术。它对于了解线程和进程之间的交互、某些事件的持续时间和某些操作的顺序非常有用。

LTTng 是一种 Linux 工具,可用于跟踪用户空间应用程序或 Linux 内核本身。它生成的跟踪文件可在以后进行分析,主要是在板外进行分析。Lttng 在 ArduPilot 中的实现使用的是用户空间跟踪,但只要内核启用了跟踪点(在其配置中),就可以同时监控内核内部的情况。

LTTng 已使用 Perf_Lttng 类处理 3 个操作: 开始, 结束, 计数.您可以通过调用性能工具中的 Perf.cpp.

使用 LTTng 监控 APM

为了用 LTTng首先要做的是在电路板上安装 LTTng。安装 LTTng 文档解释了如何在你的 Linux 发行版上安装它 这里.如果您的 Linux 发行版没有官方软件包,您也可以按照以下说明从源代码中构建它 这里

备注

不能使用 LTTng 因为它会调用 dlopen。在 bebop 上,我不得不使用 armhf 工具链构建整个系统,而默认情况下使用的并不是该工具链。

将跟踪事件置于代码内部

为了跟踪 ArduPilot,需要调用以下性能实用程序方法:

.利用->;perf_begin(my_perf);
.利用->;perf_end(my_perf);

在调用这些函数之前 my_perf 需要分配

AP_HAL::实用工具::perf_counter_t my_perf = .利用->;perf_alloc(AP_HAL::实用工具::PC_ELAPSED, "my_perf";);

添加多个 perf 事件的示例可参见 本补丁.

跟踪捕捉

在 ArduPilot 中启用跟踪事件

一旦您在电路板上启动了修改版 ArduPilot,并且 LTTng 工具,可以检查 ArduPilot LTTng 事件可通过以下命令在控制台终端上查看:

lttng 清单 --用户空间

这将输出一个事件列表,其中包括

ardupilot:计数 (loglevel: 跟踪调试行 (13)) (类型: 追踪点)
ardupilot:最后 (loglevel: 跟踪调试行 (13)) (类型: 追踪点)
ardupilot:兴办 (loglevel: 跟踪调试行 (13)) (类型: 追踪点)

提示

参考 LTTng 文档 了解如何列出内核事件。

捕捉跟踪会话

跟踪会话可以启动、停止、重新启动和销毁。

销毁跟踪会话不会从永久存储中删除跟踪,但意味着如果要继续捕获,必须重新启动一个新的会话。

  1. 创建会话:

    lttng 创建 -o 我的轨迹目录
    
  2. 启用 ArduPilot 事件:

    lttng 以便-事件 --用户空间 ardupilot:计数
    lttng 以便-事件 --用户空间 ardupilot:最后
    lttng 以便-事件 --用户空间 ardupilot:兴办
    

    要启用内核事件,请参阅 本说明.

  3. 开始捕捉

    lttng 启动
    
  4. 停止捕捉:

    lttng 停止
    
  5. 如果您有 babeltrace 安装在船上,您可以查看文本结果:

    lttng 观点
    
  6. 重新启动或销毁会话:

    lttng 毁灭
    

分析跟踪

要分析跟踪结果,首先要将创建会话时指定的跟踪目录复制到计算机上。

Babeltrace

您可以使用 babeltrace.这是一个命令行工具,能够将跟踪信息转换成文本格式:

babeltrace 我的轨迹目录

结果是一系列事件,并带有相应的时间戳和运行 CPU 的编号。

要想更进一步,您可以使用 babeltrace 的 python 绑定 来编写一个 python 程序,对捕捉到的轨迹进行分析。

跟踪罗盘

跟踪罗盘 是一个 Eclipse 插件,可以读取 LTTng 并在用户界面中显示,以适应某些分析。

Lttng2lxt

跟踪指南针非常强大,但到目前为止,我还无法以一种方便的方式分析用户空间跟踪。

Lttng2lxt 是一款开源工具,由来自 Parrot 的 Ivan Djelic 编写。它是一个非常简单的命令行工具,可以生成可由以下设备读取的波形 gtkwave.我已将对 ArduPilot 事件的支持添加至 lttng2lxt.

要使用它,请从我的 Github 仓库获取源代码:

git 复制 https://github./jberaud/lttng2lxt

您必须安装 libbabeltrace-ctf-devlibbabeltrace.在 Debian 或 Ubuntu 上,请执行以下命令:

苏都 适切-获取 安装 libbabeltrace-ctf-设计 libbabeltrace

编译:

苏都 生产 安装

用它生成一个 gtkwave 波形文件:

lttng2lxt 我的轨迹目录

这将生成一个名为 my_trace_directory.lxt.

使用 gtkwave 分析轨迹

首次安装 gtkwave.在 Debian 或 Ubuntu 上,您可以使用以下命令执行此操作:

苏都 适切-获取 安装 gtkwave

然后使用 gtkwave:

gtkwave -A 我的轨迹目录.lxt

使用 缩放配合 按钮 zoom_fit.

结果应该是这样的

../_images/after_zoom_fit.png

然后,您可以放大或缩小,查看准确的执行顺序以及相关的时序

../_images/timings.png

因此,您可以使用光标来测量事件的持续时间(使用鼠标中键设置第一个光标)