想象你是一座繁忙城市的交通管理局局长。城市的道路上,成千上万的车辆在信号灯系统的指挥下穿梭。有一天你接到大量投诉:某条主干道的绿灯亮起却迟迟没有车通过,而旁边的 VIP 车队却被堵在收费关卡前动弹不得。你派交警蹲守一整天,只看到“偶尔卡顿”;你想调取录像,却发现这座城市根本没有监控。这,就是无数嵌入式工程师调试实时系统的日常——系统明明在运行,却拿不出任何“现场回放”来回答“刚才到底发生了什么”。 Tracealyzer 就是为这类系统装上的一套“全城智能交通监控”。它平时不打扰任何车辆,只在暗处默默记录每一辆车的行驶轨迹、每一次路口放行、每一座收费站的占用与释放;当问题发生时,打开监控大屏,就能把运行过程一帧一帧回放。那些隐藏的“交通悬案”——VIP 被堵、全城拥堵、停车场饱和——都会在回放中露出马脚。 本文将以这套“城市交通监控系统”为主线,带你完成三件事:把摄像头装遍全城(集成配置)、学会看懂监控大屏(关键视图)、亲手破获一场真实的堵车悬案(实战案例)。读完你会发现,调试实时系统不再靠猜,而是靠“看录像”。
掌握 Tracealyzer,意味着你能用“上帝视角”审视 RTOS 的每一次调度决策,把模糊的“系统偶发卡顿”变成可定位、可复现、可修复的工程问题——这是嵌入式与 AIoT 从业者从“能跑通”迈向“跑得稳、跑得快”的分水岭。
目录
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
工具概述:认识这台“全城监控系统”
交通局长的困境,也是嵌入式工程师的困境:系统明明在运行,却没有一台“监控”能还原运行现场。Tracealyzer 就是为 RTOS 系统装上的一套“全城智能交通监控系统”。它由瑞典 Percepio 公司出品,通过在目标系统中植入一个轻量级的追踪记录库(Trace Recorder),对内核的关键动作“全程摄像”——每一次任务切换、每一次中断进入与退出、每一次资源获取与释放,都会被记录成一条条带时间戳的事件。
录制结果既可以在目标板上暂存,也可以通过串口实时传回 PC 客户端,以可视化图形呈现。Tracealyzer 支持 FreeRTOS、Zephyr、RT-Thread、μC/OS 等主流 RTOS,并提供快照(Snapshot)与流式(Streaming)两种录制模式。快照模式像“执法记录仪”——数据存在板载 RAM 里,录满即停,事后用调试器导出;流式模式像“实时上传摄像头”——数据边产生边通过串口或 J-Link RTT 传回电脑,可连续录制很久。
有了这套“全城监控”,你不再需要蹲在某个路口苦等事故,只需要在监控中心回看录像,就能知道哪条路、哪个时刻、哪辆车出了问题。
- R_events(事件速率)内核每秒产生的可追踪事件数量,单位为“条/秒”。任务切换越频繁、中断越多,事件速率越高。
- T_window(观测窗口)从开始录制到停止录制经过的时间,单位秒。窗口越长,覆盖的现场越多。
- N_events(事件总量)事件速率乘以观测窗口,得到这段时间产生的总事件数,直接决定需要准备多大的存储空间。
追踪原理:摄像头如何记录每一帧
交通摄像头的核心能力,是给每一帧画面打上“时间戳 + 位置 + 车牌”。Tracealyzer 的追踪原理与此如出一辙:它必须在内核的关键“路口”安插探针,在事件发生的瞬间记下“谁、在什么时刻、做了什么”。
这些探针就是钩子(Hook)机制。FreeRTOS 内核在任务切换、队列收发、信号量操作等关键函数内部,预留了可配置的追踪调用点;Tracealyzer 的 Recorder 库挂在这些调用点上,以极短的指令序列把事件写入缓冲区。每个事件记录包含:事件类型(如任务切换)、目标对象 ID(如任务句柄)、时间戳,以及若干附加数据。
时间戳是追踪的“灵魂”。Tracealyzer 通常利用芯片自带的周期计数器(如 Cortex-M 的 DWT->CYCCNT)或系统节拍计时器,将时间分辨率细化到纳秒级。事件写入方式采用环形缓冲区:新事件不断覆盖最旧事件。在快照模式下,缓冲区大小直接决定了能录制多长的“现场”。
- Size_event(单条事件体积)每条事件在缓冲区中占用的字节数,因事件类型而异,通常为 8~16 字节。
- N_events(事件总量)由事件速率和观测窗口相乘得到,即前面公式给出的结果。
- Buffer_size(缓冲区大小)两者相乘,得到快照模式下需要的 RAM 总量。缓冲区过小会导致早期事件被覆盖,就像存储卡录满后开始抹掉最前面的录像。
集成配置:把摄像头装到城市的各个路口
装摄像头不是即插即用:需要布线、通电、联网、调试画面。把 Tracealyzer 集成到 FreeRTOS 工程也遵循“三步走”:移植 Recorder 库、修改内核配置、选择导出通道。
第一步是下载 Percepio 官方提供的 Tracealyzer Recorder for FreeRTOS 源码,将 trcKernelPort.c、trcKernelPort.h、trcRecorder.c 等文件加入编译工程。第二步是修改 FreeRTOSConfig.h:开启 configUSE_TRACE_FACILITY 和 configUSE_TIMERS,并包含 trcRecorder.h。第三步是在应用入口调用 xTraceEnable() 启动录制。为了让时间戳更精准,还可在 configCPU_CLOCK_HZ 中正确配置主频。
导出通道的选择对应两种模式。快照模式在录制结束后,通过调试器(如 J-Link)暂停状态下读取 RAM 中的缓冲区,导出 .psf 文件。流式模式在 Recorder 配置中选择 UART 或 J-Link RTT 作为传输通道,数据持续上传到 PC 客户端。对于资源极紧张的 MCU,还可以通过 traceTASK_* 宏裁剪不需要的事件类型,把追踪开销压到最低。
线布好了、电通上了,监控中心的屏幕上终于出现了实时画面——接下来你要学会的是“怎么看”。
- Buffer_size(缓冲区大小)待导出的数据总量,来自上一节公式。
- B_rate(传输速率)导出通道每秒传送的字节数。例如 UART 115200 波特率时约为 11.5 KB/s,而 J-Link RTT 可达数 MB/s。
- T_export(导出时间)数据量与传输速率之比。导出耗时越短,调试等待越少,实时场景越推荐流式模式。
关键视图:看懂监控大屏的三种画面
监控中心的大厅里挂着几块屏幕,每一块都有不同的用途。Tracealyzer 的客户端同样提供多个视角,其中最重要的是时间轴视图、CPU 负载视图和资源竞争视图。
时间轴视图(Timeline View)是“回放大屏”:横轴是时间,纵轴是各个任务与中断服务程序,色块代表它们正在运行,灰条代表阻塞或就绪。你一眼就能看出某个任务在哪个时间段“占着 CPU 不干活”,也能看到中断如何在任务之间强行插入。CPU 负载视图(CPU Load View)是“拥堵仪表盘”:它统计每个任务、每个中断以及空闲状态各自占用 CPU 的比例,并以柱状图呈现。如果空闲时间接近零,说明系统已经“全路饱和”。
资源竞争视图(Kernel Objects View)则像“收费站监控”:它展示信号量、互斥量、消息队列、事件标志组的获取/释放历史,以及任务在哪些资源上发生过等待。配合任务与内核对象的树形关系,你可以顺着一条阻塞链,找到“谁被谁堵住”。
扫一眼这三块屏幕,你就能回答“哪里堵、为什么堵”。但真正的挑战在于:当三块屏幕同时报警,如何锁定事故元凶?
- T_busy(忙碌时间)统计周期内所有任务与中断执行时间的总和,注意空闲任务的运行不算忙碌。
- T_total(总时间)观测窗口的时长,即结束时刻减开始时刻。
- CPU_load(CPU 负载率)忙碌时间与总时间之比再乘 100%,得到百分比。Tracealyzer 的 CPU 负载视图正是对每个统计窗口重复应用这一公式。
瓶颈定位:揪出堵车的真正元凶
有了监控不等于会破案。实时系统中最常见的三类“交通事故”,在 Tracealyzer 的回放中各有典型的“案发现场”。
第一类是优先级反转(Priority Inversion)。案发现场长这样:高优先级任务长期处于就绪状态却不被调度,或者阻塞在一个互斥量上;回溯时间轴,发现该互斥量被一个低优先级任务持有,而中间还有一个中优先级任务在不断抢占 CPU,导致低优先级任务迟迟无法释放锁。FreeRTOS 的互斥量(Mutex)默认支持优先级继承,可如果工程错误地使用了二值信号量实现互斥,就会失去继承机制,视频铁证会立刻指出这一点。
第二类是 CPU 过载(CPU Overload)。案发现场表现为空闲时间占比持续接近零,且某些周期任务的执行时间波动剧烈,导致周期抖动。用 CPU 负载视图逐项排查各任务的实际执行时间,往往能发现某个任务由于轮询等待、软件延时或过度日志输出,消耗了远超预期的 CPU。第三类是内存问题:内存堆视图中的“已用内存”曲线如果单调上升、回落幅度小,就是内存泄漏的典型特征;曲线呈锯齿状上涨则暗示碎片化。
掌握了这三类“案发特征”,你就能在监控回放中迅速锁定元凶——就像老刑警看录像,一眼就能认出惯犯的手法。
- T_i(单次响应时间)第 i 次观测中,任务从进入就绪队列到真正获得 CPU 的时间间隔,受系统负载与抢占情况影响。
- N(观测次数)统计的响应事件总数,样本越多平均值越能反映真实水平。
- T_resp(平均响应时间)所有单次响应时间求和后除以次数,Tracealyzer 的统计视图会自动计算并绘制其变化曲线。
实战案例:一场真实“堵局”的破案全程
让我们看一个完整的破案过程。某智能设备团队开发了一款传感器融合产品:IMU 数据采集任务、GPS 解析任务、串口通信任务和 OLED 显示任务运行在 FreeRTOS 上。产品偶发“数据显示卡顿”,每次持续几十毫秒,重新上电又恢复正常。团队成员用串口打印和逻辑分析仪排查了整整一周,一无所获——因为问题发生得太随机,传统工具根本捕捉不到现场。
团队决定启用 Tracealyzer 快照模式:在 OLED 显示任务(高优先级)的代码中设置触发条件,当检测到显示延迟超过阈值时,让系统暂停并导出缓冲区。回放时间轴视图时,“案发现场”一目了然:显示任务在 t=12ms 尝试获取一个互斥量,却被正处于就绪状态的串口通信任务(低优先级)持有着;紧接着,GPS 解析任务(中优先级)被唤醒并持续运行了 8ms,进一步推迟了串口任务释放互斥量的时机。显示任务被阻塞了整整 2.8ms——这正是用户感知到的“卡顿”。
修复方案是对症下药:将该互斥量保留为 FreeRTOS 官方互斥量并开启优先级继承,同时在 Recorder 中过滤掉 GPS 日志输出事件以降低追踪开销。重新录制对比,显示任务的等待时间从 2.8ms 降到 0.1ms,卡顿彻底消失。这次破案全程没有改一行业务逻辑,纯粹依靠“录像回放”还原了真相。
这场“破案”告诉我们:在实时系统的世界里,猜测是最昂贵的调试方式。有了 Tracealyzer 这双“上帝视角”的眼睛,每一次偶发问题都可以变成一次有据可查的复盘。
- T_before(优化前耗时)修复前,目标操作从开始到完成的时间,这里是显示任务等待互斥量的 2.8ms。
- T_after(优化后耗时)修复后同一操作的时间,实测为 0.1ms。
- Gain(优化提升率)两个耗时的差占优化前耗时的百分比,用于量化优化收益。
AI 应用场景
场景一:端侧 AI 推理任务的实时性保障
阶段:模型部署后的运行时性能调优(TinyML/嵌入式 AI)
解决的问题:AI 推理任务(如人脸识别、关键词唤醒)运行在 MCU 上时,常被其他任务抢占或阻塞,导致推理超时。传统做法是到处加测时日志,既改变时序又要反复编译烧录。Tracealyzer 以旁观者身份录制完整调度事件流,直接呈现推理任务“被谁打断、等了多久”。
具体案例:某智能门锁中,人脸识别推理任务偶发延迟 300ms。Tracealyzer 回放发现:指纹采集任务持有 I2C 总线互斥量期间,被日志打印任务抢占,导致推理任务长时间等待。调整日志任务优先级并开启互斥量优先级继承后,推理延迟降至 5ms 以内。
场景二:自动驾驶域控通信网关的丢帧排查
阶段:多传感器数据融合的系统联调(自动驾驶软件栈)
解决的问题:激光雷达、摄像头数据经通信网关转发到融合算法任务,偶发丢帧。传统方式只能事后数包裹,看不到转发链路内部发生了什么。用 Tracealyzer 流式模式录制 10 分钟运行数据,将转发任务、中断、队列收发放在同一时间轴上对比。
具体案例:某自动驾驶域控制器中,高优先级 CAN 中断风暴频繁抢占网关转发任务,导致转发任务错过发送窗口。工程师通过时间轴视图定位到中断频率异常,加入中断合并与防抖机制后,数据完整率从 98.2% 提升到 99.99%。
场景三:工业机器人控制周期的抖动治理
阶段:实时控制回路的稳定性校核(工业 AI 控制算法)
解决的问题:六轴机器人伺服控制周期要求 1ms 恒定,但示波器测得周期存在约 50μs 的抖动。传统排查无从下手,因为抖动来自任务调度与内存分配的耦合效应。Tracealyzer 的 CPU 负载视图与内存堆视图联合分析,能一次性暴露两者之间的因果关系。
具体案例:工程师发现某周期任务执行时间忽长忽短,同时堆使用率曲线呈锯齿状上升,定位到动态内存碎片化导致 malloc 耗时暴增。将任务改为静态内存池分配后,周期抖动消失,控制精度显著提升。
Python 演示
"""用 Python 模拟 Tracealyzer 的追踪分析:解析任务调度事件流, 统计 CPU 负载并检测优先级反转.事件格式: (时间戳ms, 任务名, 事件类型)事件类型: RUN=开始执行, LOCK=获取互斥量, UNLOCK=释放互斥量, WAIT=等待资源, STOP=任务结束""" from collections import defaultdict # 模拟一段存在优先级反转缺陷的调度事件流trace = [ (0, "LowTask", "RUN"), (10, "LowTask", "LOCK"), (12, "HighTask", "RUN"), (15, "HighTask", "WAIT"), (20, "MidTask", "RUN"), (35, "MidTask", "STOP"), (40, "LowTask", "RUN"), (41, "LowTask", "UNLOCK"), (42, "HighTask", "RUN"), (50, "HighTask", "STOP"), (55, "LowTask", "STOP"),] TOTAL_TIME = 60 def compute_cpu_load(events, total_time): """统计每个任务的运行时长, 再计算 CPU 总负载.""" run_map = defaultdict(float) for i, (ts, task, evt) in enumerate(events): if evt != "RUN": continue end = events[i + 1][0] if i + 1 < len(events) else total_time run_map[task] += end - ts load = sum(run_map.values()) / total_time * 100 print("各任务运行时长:", dict(run_map)) print("CPU 总负载: %.1f%%" % load) return load def detect_priority_inversion(events): """检测高优先级任务被低优先级任务的互斥量阻塞.""" lock_holder = None for ts, task, evt in events: if evt == "LOCK": lock_holder = task elif evt == "UNLOCK": lock_holder = None elif evt == "WAIT" and task == "HighTask" and lock_holder: print("发现优先级反转: HighTask 在 %dms 等待 %s 释放锁" % (ts, lock_holder)) return True print("未发现优先级反转") return False if __name__ == "__main__": compute_cpu_load(trace, TOTAL_TIME) detect_priority_inversion(trace)
run_map = defaultdict(float)用字典为每个任务累计运行时长,defaultdict 避免键不存在时的 KeyError。end = events[i + 1][0] if i + 1 < len(events) else total_time取下一条事件的时间作为本段运行的结束时刻,模拟“当前任务一直运行到下一次调度”。load = sum(run_map.values()) / total_time * 100所有任务运行时间求和除以总时间,即 CPU 负载率公式的代码化。lock_holder = task记录当前持有互斥量的任务,相当于追踪器记下“收费站当前被谁占用”。elif evt == "WAIT" and task == "HighTask" and lock_holder高优先级任务等待且低优先级任务持锁,即优先级反转的代码判据。
常见误区
误区我刚接触这个工具时,以为它和 Keil/J-Link 调试器一样,能随时暂停系统、单步执行代码,还能在断点处修改变量。
正解Tracealyzer 不是调试器,而是追踪分析器。它更像城市监控系统:全程旁观录像,从不拦截车辆。它不会暂停系统,也不支持断点;它要做的是以最小侵入方式记录真实运行行为。分工上,调试器适合回答“代码逻辑对不对”,Tracealyzer 适合回答“系统调度顺不顺”。
为何常见:嵌入式领域最常见的工具就是调试器,新手很自然地把新工具往熟悉的“暂停-单步-修改”心智模型里套。
误区我担心加上追踪代码后,任务切换变慢、中断响应变差,测出来的数据根本不代表真实运行状态。
正解Tracealyzer 的 Recorder 经过精心设计,典型开销通常只有 1%~3% 的 CPU 周期和几 KB 的 RAM。它采用轻量级钩子、批量数据打包、可选的事件过滤,对实时性的影响远小于串口日志。更重要的是:它记录的是内核事件而非时间函数调用,时间戳来自硬件计数器,测量精度远高于“往代码里插打印语句”。
为何常见:早期软件插桩工具(如 printf 打点)确实会显著改变时序,这种历史印象让很多人高估了现代追踪工具的侵入性。
误区我以为买来工具、连上板子,它就会像杀毒软件一样弹出“检测到优先级反转、CPU 过载、内存泄漏”等诊断结论。
正解Tracealyzer 提供的是“录像”和“统计分析”,而不是“自动判案”。它准确告诉你“什么时刻谁占用了 CPU、谁在等待哪把锁”,但“这算不算故障、该怎么修”需要工程师结合业务逻辑判断。比如 CPU 负载 90%,对某些系统是健康状态,对另一些系统则是灾难。
为何常见:产品宣传视频里炫酷的视图让人产生“一键定位所有问题”的期待,忽略了工具只是信息管道,判断仍需人来完成。
误区每次看到 CPU 负载超过 80% 我就紧张,总觉得应该优化到 50% 以下才算健康。
正解实时系统的核心指标不是平均负载,而是“最坏情况下的截止时间满足率”。一个 CPU 负载 95% 但调度有序、任务全部按时完成的系统,可能比一个负载 40% 却存在优先级反转、高优先级任务频繁超时的系统更健康。Tracealyzer 的价值正在于此:它能同时呈现负载数字和调度时序,让你判断负载高是“设计如此”还是“调度失衡”。
为何常见:把服务器/PC 时代的“负载越低越好”直觉,直接套用到了实时嵌入式系统上。
误区拿到时间轴视图后,我总是把缩放级别拉到最大,盯着几微秒内的细节来回看,认为细节越多越容易发现真相。
正解过度放大反而会丢失“模式”——比如周期性抖动、渐进的延迟增长、偶发的等待峰值,这些症状需要宏观尺度才能显现。正确做法是先看整体趋势(CPU 负载、响应时间统计),锁定可疑时段,再放大到细节确认因果。Tracealyzer 的过滤、聚合和统计视图就是为这种“先宏观后微观”的排查路径设计的。
为何常见:初学者总以为真相藏在最细的颗粒度里,却忘了侦探破案先看全局地图,再放大细节。
面试题
Q1. Tracealyzer 是一款什么样的工具?
- A.可单步执行的 RTOS 调试器
- B.录制并可视化 RTOS 运行时行为的工具← 正确答案
- C.用于工程编译链接的构建工具链
- D.自动生成业务代码的代码生成器
答案:B。Tracealyzer 是追踪分析工具,通过录制内核事件并可视化回放来观察运行时行为,类似“全城监控”而非“拦车审讯”。调试器才支持暂停与单步,构建工具负责编译链接,代码生成器负责产出代码,均与追踪分析无关。
Q2. 与 FreeRTOS 集成时,主要在哪个文件中开启追踪相关配置?
- A.main.c 主程序业务逻辑文件
- B.FreeRTOSConfig.h 配置文件← 正确答案
- C.链接脚本文件 linker.ld
- D.工程 Makefile 编译脚本
答案:B。FreeRTOS 的内核行为开关都集中在 FreeRTOSConfig.h,追踪集成需要在此开启 configUSE_TRACE_FACILITY 等宏并包含追踪头文件。就像装摄像头要接对总配电箱,而不是去改楼层平面图。
Q3. 下列哪种现象属于优先级反转?
- A.高优先级任务抢占低优先级任务运行
- B.低优先级任务持有互斥量阻塞高优先级任务← 正确答案
- C.操作系统动态调整各任务的优先级
- D.两个任务同时在不同核上并行执行
答案:B。优先级反转的本质是“低优先级持有资源,高优先级被阻塞”。正常抢占(A)是调度器的基本行为,不是缺陷;动态调优先级(C)是继承机制的反转修复手段;并行执行(D)是多核特性。Tracealyzer 时间轴中高任务等待低任务持锁的色块组合即是铁证。
Q4. Tracealyzer 的两种录制模式是什么?
- A.硬件仿真与软件模拟模式
- B.快照模式与流式传输模式← 正确答案
- C.同步采集与异步采集模式
- D.内核级与应用级两种模式
答案:B。快照模式把事件先存进板载 RAM,事后由调试器导出,适合资源紧张的现场;流式模式边录边通过串口或 RTT 上传,适合长时间录制。两者区别就像“执法记录仪回传”与“实时云端直播”。
Q5. 下列问题中,Tracealyzer 可以直接定位的有哪些?
- A.优先级反转造成的响应延迟← 正确答案
- B.CPU 过载导致的周期任务超时← 正确答案
- C.内存泄漏导致的堆持续增长← 正确答案
- D.源代码缩进与注释不规范
答案:ABC。优先级反转可通过时间轴视图确认等待链,CPU 过载可通过负载视图量化,内存泄漏可通过堆视图观察增长曲线。可读性问题是静态分析领域的事,追踪工具不负责审查代码风格。
Q6. CPU 负载率的标准计算方式是?
- A.就绪任务数除以系统中总任务数
- B.忙碌时间除以总的观测时间← 正确答案
- C.空闲任务栈大小除以总栈大小
- D.中断发生次数除以时钟周期数
答案:B。CPU 负载率 = 忙碌时间 / 总时间 × 100%,衡量的是“道路被车辆占用的比例”。就绪任务数只反映排队长度,栈大小反映空间问题,中断次数反映事件频率,三者都不是负载的定义。
Q7. 在时间轴视图中,任务状态是如何呈现的?
- A.按任务创建的顺序纵向排列
- B.横轴时间纵轴任务色块显状态← 正确答案
- C.按内存地址从低到高排序显示
- D.以代码行号先后顺序横向排列
答案:B。时间轴视图横轴是时间,纵轴每一行代表一个任务或 ISR,色块颜色与宽度表示运行/阻塞/就绪状态及持续时间,类似监控回放的“车道-时间”展开图。
Q8. 关于快照模式,下列说法正确的有哪些?
- A.追踪数据首先暂存在目标板 RAM 中← 正确答案
- B.需要借助调试器或专门方式导出数据← 正确答案
- C.录制时长可以做到无限长而不断电
- D.适合实时性和容量受限的嵌入式现场← 正确答案
答案:ABD。快照模式将事件写入 RAM 环形缓冲区,录满后停止,再通过调试器导出,因此录制时长受 RAM 限制,适合小容量现场。C 恰恰是流式模式的特性,与快照相反。
Q9. 流式模式相对快照模式最大的优势是什么?
- A.不需要任何额外的硬件支持
- B.边运行边传输可支撑长时间录制← 正确答案
- C.追踪开销被完全降低到零
- D.能自动修复系统中的全部缺陷
答案:B。流式模式通过串口或 RTT 持续把事件传回 PC,缓冲区只做短暂中转,因此可以连续录制几分钟乃至几小时。RTT 同样需要调试器硬件支持,追踪仍有少量开销,更不可能自动修 BUG。
Q10. 关于 Tracealyzer 的追踪开销,下列说法正确的有哪些?
- A.主要通过钩子记录内核事件产生开销← 正确答案
- B.通常只占用少量 CPU 与内存资源← 正确答案
- C.在实时性要求高的场景需注意缓冲区配置← 正确答案
- D.追踪期间必须停掉所有其他中断
答案:ABC。开销来自钩子事件记录,量级约为 CPU 百分之几、RAM 几 KB。缓冲区过小会丢事件,需按事件率合理配置。追踪中断本身就是 Tracealyzer 的核心能力,停掉中断等于让监控系统“失明”。