# Rtos Debug

> 当需要进行 FreeRTOS/RT-Thread/Zephyr 的线程感知调试，查看任务列表、栈水位或死锁检测时使用。

- Skill: `leokemp223/rtos-debug` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add leokemp223/rtos-debug`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leokemp223/rtos-debug/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: leokemp223 (https://skillmd.com/u/leokemp223)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/leokemp223/rtos-debug

---


# RTOS 调试

## 适用场景

- 固件运行了 RTOS（FreeRTOS、RT-Thread 或 Zephyr），需要查看任务状态。
- 怀疑任务栈溢出导致 HardFault 或异常行为。
- 需要检测死锁（所有任务都处于等待状态）。
- 需要查看队列、信号量等内核对象状态。
- 需要自动识别固件使用的 RTOS 类型。

## 必要输入

- 带符号的 `ELF` 文件路径。
- 已运行的 GDB Server（OpenOCD 或 JLinkGDBServer），通过 `--port` 指定 GDB 端口。
- 可选显式指定 RTOS 类型（`--rtos freertos|rt-thread|zephyr`）。

## 自动探测

- 通过 ELF 符号表自动判断 RTOS 类型：`vTaskStartScheduler` → FreeRTOS，`rt_thread_init` → RT-Thread，`k_thread_create` → Zephyr。
- 不依赖 OpenOCD 的 RTOS awareness 功能，改用 GDB 直接读取 RTOS 内核数据结构。
- FreeRTOS 提供完整支持（任务列表、栈水位、队列），RT-Thread/Zephyr 提供基本任务列表支持。

## 执行步骤

1. 先阅读 [references/usage.md](references/usage.md) 和 [references/rtos-patterns.md](references/rtos-patterns.md)，了解常见 RTOS 问题模式。
2. 确保 GDB Server（OpenOCD 或 JLinkGDBServer）已在运行。
3. 若不确定 RTOS 类型，先运行 [scripts/rtos_debugger.py](scripts/rtos_debugger.py) 的 `--detect` 模式。
4. 使用 `--tasks` 查看任务列表和状态。
5. 使用 `--stack-check` 检查各任务栈水位。
6. 使用 `--deadlock` 检查死锁特征。
7. 使用 `--queues` 查看队列和信号量状态。

## 失败分流

- 当缺少 GDB 时，返回 `environment-missing`。
- 当没有可用的 `ELF` 时，返回 `artifact-missing`。
- 当 GDB 无法连接到 GDB Server 时，返回 `connection-failure`。
- 当 ELF 中未检测到 RTOS 符号时，返回 `project-config-error`。
- 当 GDB 可以连接但无法读取 RTOS 数据结构时，返回 `target-response-abnormal`。
- 当无法确定 RTOS 类型时，返回 `ambiguous-context`。

## 平台说明

- 自带脚本使用 Python 标准库和 subprocess 调用 GDB，跨平台兼容。
- GDB Server 需要由用户或上游 skill（`debug-gdb-openocd` 或 `debug-jlink`）预先启动。
- RTOS 数据结构读取依赖 ELF 符号信息，Release 优化可能导致部分符号被优化掉。

## 输出约定

- 输出检测到的 RTOS 类型和版本（如果可获取）。
- 输出任务列表，包含任务名、状态、优先级和栈使用信息。
- 栈水位低于安全阈值时输出告警。
- 死锁检测结果以明确的是/否形式输出。
- 在 `Project Profile` 中更新 `rtos` 字段。

## 交接关系

- 当确认栈溢出时，建议使用 `memory-analysis` 分析固件内存布局。
- 当需要更深入的单步调试时，交给 `debug-gdb-openocd` 或 `debug-jlink`。

