参考链接:Task Trace — NuttX latest documentation
任务跟踪是收集 NuttX 内核中各种事件并以图形方式显示结果的工具。
它可以收集以下事件:
- 任务执行、终止、切换
- 系统调用的进入/离开
- 中断的进入/离开
环境:
- ubuntu18.04 linux version 5.4.0-42-generic
- nuttx10.0.1
- trace-compass-7.0.0-20210609-2151-linux.gtk.x86_64
Linux下的指南
一、JDK\JRE安装
参考链接Ubuntu安装JDK-阿里云开发者社区 (aliyun.com)
1、安装openjdk
这里注意使用openjdk11,如果使用openjdk8会无法安装TraceCompass
sudo apt-get install openjdk-11-jdk
2、配置环境变量
vim ~/.bashrc
最后一行增加
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
3、测试jdk是否安装成功
java -version
二、Trace Compass安装
1、下载linux版本的trace Compass
Trace Compass (eclipse.org)
我这里下载的版本是trace-compass-7.0.0-20210609-2151-linux.gtk.x86_64
2、对应目录下,进行解压
tar xvzf trace-compass-7.0.0-20210609-2151-linux.gtk.x86_64.tar.gz
3、启动
进入解压出来的目录,运行./tracecompass
启动成功
三、插件安装与参数设置
1、插件安装
安装完成后,执行并选择Tools -> add-ons 菜单,然后选择Install Extensions 安装名为“Trace Compass ftrace (Incubation)”的扩展。
2、配置nuttx
make menuconfig
* RTOS Features → Performance Monitoring ->system performance monitor hooks
* RTOS Features → Performance Monitoring ->instrumenation filter
* RTOS Features → Performance Monitoring ->interrupt handler monitor hooks
* Device Drivers ->Note Driver support
* Device Drivers -> Note Driver Support-> Note driver selection -> note ram driver
* Device Drivers -> Note Driver Support-> Scheduler instrumentation filter control driver
* Application Configuration -> System Libraries and NSH Add-Ons -> trace command
* Application Configuration -> System Libraries and NSH Add-Ons -> system command
四、任务追踪命令trace可配置参数说明
1、 CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE
配置路径:RTOS Features → Performance Monitoring->Default instrumentation filter mode
- 指定默认过滤器模式。如果设置了以下位,则在引导时启用相应的检测。
- 位 0 = 启用检测; 位 1 = 启用系统调用检测; 位 2 = 启用 IRQ 检测 ;位 3 = 启用收集系统调用参数
2、 CONFIG_SCHED_INSTRUMENTATION_HIRES
配置路径:RTOS Features -> Performance Monitoring -> System performance monitor hooks (SCHED_INSTRUMENTATION [=y]) -》Use Hi-Res RTC for instrumentation
如果启用,请使用更高分辨率的系统计时器进行检测。
3、 CONFIG_DRIVER_NOTERAM_BUFSIZE
以字节为单位指定笔记缓冲区大小。较高的值可以容纳更多的记录,但会消耗更多的内核内存。
4、 CONFIG_DRIVER_NOTERAM_TASKNAME_BUFSIZE
以字节为单位指定任务名称缓冲区大小。缓冲区用于在检测期间保存任务的名称。通过使用此缓冲区,跟踪转储可以在检测数据中找到并显示与给定 pid 对应的任务名称。如果指定为 0,则禁用此功能并且跟踪转储仅显示新创建的任务的名称。
5、 CONFIG_DRIVER_NOTERAM_DEFAULT_NOOVERWRITE
如果启用,默认情况下,当缓冲区已满时,停止覆盖循环缓冲区中的旧笔记。这对于保留系统启动开始时的检测数据很有用。
五、trace 命令说明
- 启动任务跟踪
trace start [-c][<duration>]
-c
: 继续之前的跟踪。在开始新的跟踪之前不会清除跟踪数据。<duration>
: 以秒为单位指定跟踪的持续时间。任务跟踪在指定时间段后停止。如果未指定,则跟踪将继续,直到被命令停止。
-
停止任务跟踪
trace stop
-
跟踪命令(跟踪某个命令)
在运行指定命令时获取跟踪。命令终止后,停止任务跟踪。要使用此命令,需要启用 CONFIG_SYSTEM_SYSTEM。
trace cmd [-c] <command> [<args>...]
-c
:继续之前的跟踪。在开始新的跟踪之前不会清除跟踪数据。<command>
: 指定命令以获取任务跟踪。<args>
:命令的参数。
例子:nsh > trace cmd sleep 1
- 跟踪转储
输出跟踪结果。如果任务跟踪正在运行,它会在输出之前停止。
trace dump [-c][<filename>]
- 在输出之前不要停止跟踪。由于转储跟踪本身是一项任务活动,并且在输出时添加了新的跟踪数据,因此转储永远不会停止。
- : 指定文件名以保存跟踪结果。如果未指定,则将跟踪结果显示到控制台。
- 跟踪模式
设置任务跟踪模式选项。默认值由内核配置CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE 给出。
trace mode [{+|-}{o|s|a|i}...]
- +o :启用覆盖模式。跟踪缓冲区是一个环形缓冲区,如果缓冲区中没有可用空间,它可以覆盖旧数据。启用此行为。
- -o : 禁用覆盖模式。当缓冲区已满时,将处理新的跟踪数据。这对于保留跟踪开始的数据很有用。
- +s : 启用系统调用跟踪。它记录了应用程序发出的进入/离开系统调用的事件。默认情况下会记录所有系统调用。 trace syscall 命令可以过滤要记录的系统调用。
- -s : 禁用系统调用跟踪。
- +a : 启用记录系统调用参数。它将传递给发出的系统调用的参数记录到跟踪数据中。
- -a : 禁用记录系统调用参数。
- +i : 启用中断跟踪。它记录跟踪时发生的进入/离开中断处理程序的事件。默认情况下会记录所有 IRQ。 trace irq 命令可以过滤要记录的 IRQ。
- -i : 禁用中断跟踪。
- 跟踪系统调用
配置系统调用跟踪过滤器。
trace syscall [{+|-}<syscallname>...]
+<syscallname>
:将指定的系统调用名称添加到过滤器中。过滤后的系统调用的执行不会记录到跟踪数据中。-<syscallname>
:从过滤器中删除指定的系统调用名称。
通配符“*”
可用于指定系统调用名称。例如“trace syscall +sem_*”过滤以“sem_”开头的系统调用,如sem_post()、sem_wait()、…
如果未指定命令参数,则显示当前过滤器设置如下。
nsh> trace syscall
Filtered Syscalls: 16
getpid
sem_destroy
sem_post
sem_timedwait
sem_trywait
sem_wait
mq_close
mq_getattr
mq_notify
mq_open
mq_receive
mq_send
mq_setattr
mq_timedreceive
mq_timedsend
mq_unlink
- 跟踪中断
配置中断跟踪过滤器。
trace irq [{+|-}<irqnum>...]
+<irqnum>
:将指定的 IRQ 编号添加到过滤器。过滤后的 IRQ 处理程序的执行不会记录到跟踪数据中。-<irqnum>
:从过滤器中删除指定的 IRQ 编号。
通配符“*”可用于指定所有 IRQ。如果未指定命令参数,则显示当前过滤器设置如下。
nsh> trace irq
Filtered IRQs: 2
11
15
六、使用示例
1、trace start 开启追踪
2、调用hello 模拟其他任务启动
3、trace dump 输出任务追踪信息
可以看到红框处显示的追踪信息里面有我们调用hello是的情况。由于我这里使用过的是仿真sim,使用trace dump xxx要导出任务追踪记录会失败。无法导出后使用trace compass可视化界面分析系统的任务调用情况。
这里暂时先写到这里,后续如果有板子开始调试会继续更新。