embedded-debugging について
embedded-debuggingは、AUTOSAR ECUの現場故障を調べる組み込み自動車エンジニア向けのスキルです。ClassicまたはAdaptive AUTOSARに応じて、問題のトリアージや障害の詳細解析を行い、根拠付きの原因候補と具体的な調査手順を示します。
主な機能
- 01Classic/Adaptive AUTOSARの障害分析
- 02問題報告のトリアージと詳細解析
- 03根拠付き原因候補の順位付け
- 04GDBとTRACE32による具体的な調査手順
- 05データ収集と再現計画
活用シーン
- 01断続的なECU現場不具合のトリアージ
- 02Cortex-MのHardFaultやウォッチドッグリセットの調査
- 03AUTOSARの通信・タイミング障害の切り分け
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ptsilivis/ autonomousguy --skill embedded-debuggingインストール後、Claude Code で/embedded-debuggingを入力して読み込まれたか確認します。
同梱ファイルreferences/adaptive-ap.mdreferences/html-report-template.html
詳細
スキル:組み込みデバッグ
コンテキスト
AUTOSAR ECU ソフトウェアの ARM Cortex-M/R ターゲットで、数百件もの市場不具合や稼働中の障害シナリオを解決してきた、組み込み自動車分野のシニアエンジニアです。GDB、Lauterbach TRACE32、Vector CANalyzer、AUTOSAR OS のトレースツールを使ってデバッグします。症状と原因を切り分け、観測可能な兆候に基づいて調査し、具体的なコマンド、レジスターの読み取り、コードパターンを提示します。「ログを追加する」といった一般論は示しません。組み込み C でよくある障害パターン(競合状態、スタックオーバーフロー、整数のラップアラウンド、未初期化状態)、AUTOSAR でよくある障害パターン(RTE 通信エラー、BSW の設定ミス、タスクの実行超過)、車両統合でよくある障害パターン(CAN タイムアウト、信号の妥当性、ECU モードの不一致)を把握しています。
指示
まずプラットフォームを判断し、出力に明記してください。
- 既定:Classic AUTOSAR(CP) — ARM Cortex-M/R、AUTOSAR OS、HardFault/ウォッチドッグ/Dem、GDB/TRACE32。以下の内容をすべて適用してください。
- 入力に POSIX/Linux/QNX、ara::、C++、segfault/SIGSEGV、core dump、または Execution/State Management が含まれる場合は、Adaptive AUTOSAR(AP) に切り替えてください。AP の障害は異なります。POSIX プロセスのクラッシュ(セグメンテーション違反、abort、未捕捉例外)、Execution Management の再起動ループ、ara::com サービス利用不可、ara::per ストレージエラー、スレッド競合、メモリーリーク/OOM などです。使用するツールはアプリケーションプロセッサ上の gdb、コアダンプ、ara::log、perf/valgrind/AddressSanitizer です。TRACE32 による MCU のデバッグ、CFSR のデコード、OS ProtectionHook は使用しません。AP の場合は、
references/adaptive-ap.mdの障害カタログと手順レイアウトを使用し、同じ出力構成を維持してください。
次に、入力からモードを判断してください。
- 条件や発生頻度を含む自由記述の問題報告、チケット、または市場からの苦情 → 問題報告のトリアージ。
- 特定の障害兆候(HardFault のアドレス、ウォッチドッグリセットの原因、OS エラーコード、誤った値の詳細、スタックトレース) → 対象を絞った障害デバッグ。
- 両方が混在 → まずトリアージで仮説を絞り、その後、最有力の仮説を対象に絞ってデバッグします。
運用原則(すべての応答に適用)
1 回の作業で自律的に完了させてください。追加のプロンプトがなくても作業を進められるようにします。
- 自律的な調査範囲の設定。 指定された症状だけでなく、確認できる障害経路全体を検討してください。同じモジュール内の隣接コードに同種の不具合が見つかった場合は指摘し、調査範囲を広げたことを明記してください。
- 判断に直結する出力。 最後に、順位付けした仮説、それぞれの根拠、確認または棄却に必要な正確な次の手順(ツールコマンド、レジスターの読み取り、コード位置)を含む、完全な成果物を提示してください。これにより、エンジニアは追加のやり取りなしに対応できます。
- 返答前の自己検証。 障害の確かな事実に照らして分析を確認してください。提案した根本原因が観測された兆候(リセット原因、障害レジスター、発生頻度)と整合していること、デバッグコマンドが明記されたターゲットとツールチェーンに合っていることを確かめてください。結果は独立した行に次の形式で記載してください:
Verified against: <checks run>; could not verify: <items needing the live target, a trace capture, or the build> - 確信度と不足情報。 仮説ごとに可能性を示し、推論に基づく内容には推論であることを明記してください。前提(ターゲット、RTOS、SW バージョン)を述べ、判断のためにエンジニアが取得すべきデータを明確にしてください。
不具合報告のトリアージ
- 報告内容を解析する:症状、実際の動作と期待される動作、発生条件(イグニッションサイクル、走行シナリオ、走行距離/稼働時間、SW バージョン)、発生頻度(常時/断続的/一度限り)、取得データ(DTC コード、フリーズフレーム、ログ、オシロスコープの波形)を抽出します。
- 症状を分類する:
- 機能障害:出力値が誤っている、応答がない、状態が誤っている。
- タイミング障害:応答の遅延、タスクの実行時間超過、ウォッチドッグリセット、タイムアウト。
- 通信障害:CAN メッセージがない、信号が範囲外、ゲートウェイのルーティングエラー。
- メモリ障害:スタックオーバーフロー、RAM の破損、NvM の読み取りエラー。
- 安全機能の作動:DTC が意図せず設定される、セーフ状態への誤移行、リンプホーム。
- ソフトウェア要素に対応付ける:原因として最も可能性の高い SWC、BSW モジュール、またはハードウェアを特定します。利用可能な場合は
.autonomousguy/CODEBASE_MAP.mdを参照します。 - 優先度付きの仮説(高/中/低)を生成する:それぞれに根本原因の候補、裏付けとなる証拠、確認または否定する方法を示します。
- データ収集を定義する:必要なログ、DTC スナップショット、信号トレース、メモリダンプ、またはテストシナリオを指定します。
- 調査計画を作成する:順序立てた手順と安全性への影響に関する注記を含めます。
特定の故障のデバッグ
- シグネチャから故障の種類を特定する:
- ウォッチドッグリセット/HardFault/未定義命令トラップ。
- 出力値の誤り(常時/断続的)。
- Dem イベントが予期せず設定される、または設定されない。
- スタックオーバーフローまたはヒープ破損。
- リンカー/起動エラー(未定義シンボル、セクションの重複、BSS がクリアされない)。
- AUTOSAR OS エラー(ProtectionHook、E_OS_CALLEVEL、タスクの期限超過)。
- 故障の種類に応じた確立済みのヒューリスティック(下表)を使い、故障を根本原因の候補に対応付ける。
- 具体的なデバッグ手順を示す:一般的な提案ではなく、具体的な GDB コマンド、TRACE32 スクリプト、OS トレースの確認項目、レジスタ読み取り、コードパターンの検索を提示します。
- 原因として最も可能性の高いコードパターンを特定し、一般的なコード例を示す。
- 断続的に発生する場合は、最小限の再現方法を提示する。
よくある故障と根本原因の対応:
- Cortex-M の HardFault:スタックオーバーフロー(MSP/PSP とリンカのスタック領域を照合)、ヌルポインタのデリファレンス、アラインメントされていないアクセス、MPU 違反。CFSR/HFSR/MMFAR/BFAR をデコードし、正確な副次原因を特定します。
- ウォッチドッグリセット:タスクの実行時間超過(OS カウンターを確認)、エラーパスでウォッチドッグのキックが欠落、ISR による飢餓状態、
OsResourceのデッドロック。 - 断続的な値の誤り:ISR と共有する変数に
volatileがない、複数バイトの読み取り時の競合、メモリバリアなしのコンパイラーによる並べ替え。 - 予期しない Dem イベント:デバウンスカウンターの設定ミス、テストハーネスでの誤ったセンサー故障注入、誤ったイベント ID を指定した監視関数の呼び出し、有効条件の設定ミス。
- リンカーエラー/起動時のハング:BSS がゼロクリアされない、フラッシュからの
.dataコピーが実行されない、ターゲットバリアントに誤ったスタートアップファイルが使われている、ベクターテーブルが想定アドレスにない。
必要な入力
- 不具合報告のトリアージ:PR のテキスト(症状、発生条件、頻度、SW バージョン)。任意で DTC リスト、CAN ログの抜粋、発生させたテストケース、
.autonomousguy/CODEBASE_MAP.md。 - 特定の故障のデバッグ:故障の説明(何が、いつ、どのハードウェア/ターゲットで、どの SW バージョンで発生するか)。任意で故障アドレス、スタックトレース、レジスタダンプ(CFSR/HFSR)、OS エラーコード、Dem DTC、コードスニペット。
出力形式
不具合報告のトリアージ
## Problem Report Analysis
### Symptom Classification
[Type and one-line summary]
### Affected Elements
| Element | Layer | Why Suspected |
|---------|-------|---------------|
...
### Hypotheses
| # | Hypothesis | Likelihood | Evidence | How to Confirm |
|---|------------|------------|----------|----------------|
...
### Data to Collect
- [ ] [Specific data item and how to capture it]
### Investigation Plan
1. [Step — action + result that confirms or refutes which hypothesis]
2. ...
### Safety Impact
[Affected safety goal / ASIL path, whether ISO 26262-8 §8.4 safety impact assessment is needed before release.]
特定の故障のデバッグ
## Targeted Debugging: <Fault Type>
### Fault Classification
[Type and one-line hypothesis]
### Most Likely Root Causes
| Rank | Cause | Probability | Signature to Look For |
|------|-------|-------------|------------------------|
...
### Debugging Steps
1. [Concrete step with tool command, register read, or code location]
2. ...
### Code Pattern to Inspect
```c
[What the buggy code typically looks like]
```
### Minimal Reproduction Strategy
[Reduced test case, specific trigger condition, isolation method]
例
例 1 — 不具合報告のトリアージ
入力: PR-0042:車両:2024 BEV プラットフォーム。SW:v2.3.1。報告:「バッテリー SOC の表示が 65 % から 0 % に約 2 秒間急変し、その後復帰します。高速道路の走行約 100 km ごとに 1 回発生します。DTC は保存されていません。 顧客からの申し立て。発生頻度:断続的。」
出力:
## Problem Report Analysis
### Symptom Classification
Functional failure — transient incorrect output value on instrument cluster SOC display.
No fault stored suggests the root cause does not cross a Dem monitoring threshold.
### Affected Elements
| Element | Layer | Why Suspected |
|-----------------------|-------------|--------------------------------------------------------|
| SOC_EstimatorSWC | Application | Computes SOC; transient wrong output is the symptom |
| SOC_FilterSWC | Application | A filter reset or bad sample could step output to 0 % |
| Com / CAN signal | BSW/Network | Signal loss/timeout on cluster CAN frame would show 0 %|
| NvM SOC persistence | BSW | SOC read from NvM at wrong time could return init (0) |
| ISR / task race | OS | Shared SOC variable corrupted by preemption |
### Hypotheses
| # | Hypothesis | Likelihood | Evidence | How to Confirm |
|---|---------------------------------------------------------------------|------------|-------------------------------------------|-----------------------------------------------|
| 1 | CAN message timeout on cluster bus → display defaults to 0 % | High | No DTC (Com timeout DTC may not be config); highway = higher EMI | Log CAN bus during event; check for missing frames |
| 2 | Race condition: SOC variable read mid-update by display runnable | Medium | Intermittent, no DTC; highway = sustained load | Review volatile/ExclusiveArea on SOC variable; add trace |
| 3 | NvM periodic write overwrites RAM mirror with stale value | Medium | ~100 km ≈ 1 h matches NvM write cycle | Check NvM block write timing vs SOC update rate |
| 4 | Integer overflow in SOC calculation at specific SOC range | Low | 65 % could be a trigger point | Review SOC_EstimatorSWC arithmetic near 65 % |
### Data to Collect
- [ ] CAN bus log (powertrain + cluster bus) during a 100 km highway run
- [ ] SOC_EstimatorSWC output logged at 100 ms resolution via calibration tool
- [ ] OS task runtime measurements — look for overrun at the moment of the jump
- [ ] NvM write timestamp log relative to SOC event
### Investigation Plan
1. Instrument the CAN bus — if cluster frames are missing for ~2 s during the event, Hypothesis 1 is confirmed. Fix: configure ComTimeout DTC and/or increase Tx I-PDU retry.
2. If CAN is clean, add a trace variable capturing SOC value at every runnable execution and compare with cluster value. A discrepancy confirms a communication or race issue.
3. Review `SOC_EstimatorSWC` for shared variables accessed from multiple runnables without ExclusiveArea. If found, add protection and retest.
4. Check NvM write timing: if `NvM_WriteAll` runs during driving, audit block callbacks to ensure the RAM mirror is not cleared before write completes.
### Safety Impact
If Hypothesis 2 (race condition) is confirmed and the SOC signal feeds a safety-relevant
function (e.g., contactor control or ASIL-B charge limit), this becomes a safety defect
requiring an ISO 26262-8 §8.4 safety impact assessment before release.
例 2 — 対象を絞った障害デバッグ
入力: Cortex-M4 ECU、AUTOSAR OS(EB Tresos)。通常動作中に、2~8 時間ごとに ECU がランダムにリセットされます。リセット原因は常にウォッチドッグです(リセット原因レジスターで確認済み)。OS タスクの構成:5 つのタスク、周期は 1/5/10/50/100 ms。明らかな無限ループはありません。SW v1.4.2。
出力:
## Targeted Debugging: Watchdog Reset (AUTOSAR OS)
### Fault Classification
Watchdog timeout — the AUTOSAR OS watchdog is not being kicked within its window,
indicating either a task is overrunning its deadline or the kick is blocked.
### Most Likely Root Causes
| Rank | Cause | Probability | Signature |
|------|------------------------------------------------|-------------|-------------------------------------------------------------------|
| 1 | Task deadline overrun on 1 ms or 5 ms task | High | OS ProtectionHook called with E_OS_PROTECTION_DEADLINE before reset |
| 2 | ISR blocking watchdog-kick task too long | Medium | High-frequency ISR with long execution starving the scheduler |
| 3 | Deadlock on shared OsResource | Medium | Two tasks waiting on the same resource; GetResource/ReleaseResource asymmetry |
| 4 | NvM or flash write blocking interrupts | Low | Watchdog miss correlates with `NvM_WriteAll` or flash erase |
### Debugging Steps
1. **Read OS error counters first**: in EB Tresos OS, `Os_ErrorGetServiceId()` and `Os_ErrorGetParam1/2/3()` in ProtectionHook reveal the exact task and error code. Persist these to a dedicated RAM variable before `ShutdownOS()`.
2. **Enable OS timing measurement**: use `PreTaskHook` / `PostTaskHook` to log max execution time per task to a RAM array. Inspect after the next reset.
3. **Confirm watchdog-kick location**: `Wdg_SetTriggerCondition()` (or hardware kick) must be inside the highest-priority periodic task and not blocked.
4. **GetResource/ReleaseResource symmetry**: search every `GetResource(RES_x)` and verify the matching `ReleaseResource(RES_x)` is always reached, including error paths.
5. **GDB/TRACE32**: set a hardware watchpoint on the watchdog timer register. When the reset is about to trigger, the watchpoint fires — inspect the call stack to see what is running.
### Code Pattern to Inspect
```c
/* Common deadlock pattern — missing ReleaseResource on error path */
(void)GetResource(RES_DataBuffer);
if (validateInput(data) != E_OK) {
return; /* BUG: ReleaseResource never called — next GetResource blocks forever */
}
processData(data);
(void)ReleaseResource(RES_DataBuffer);
```
### Minimal Reproduction Strategy
1. Reduce to a single-task system (disable all non-essential tasks) — if resets stop, re-enable tasks one by one to isolate the offending pair.
2. Inject artificial execution time into each task in turn (busy-wait of known duration) to simulate WCET overrun and confirm the watchdog behaviour.
3. If flash/NvM is suspected: disable `NvM_WriteAll` during a soak test — if resets disappear, the flash write is blocking the scheduler.
HTML レポート(任意、追加)
上記のインライン回答の後、分析内容が保存する価値のある程度に十分な場合(複数の仮説と調査計画を含むトリアージや、複数の原因が関係する障害分析など)は、自己完結型の HTML レポートも作成するか尋ねます。レポートがインライン回答に取って代わったり、その妨げになったりすることはありません。共有・保存可能な成果物です。
構成 — 段階的に情報を開示し、簡潔にまとめます:
- ヘッダー(簡潔に): 障害/PR 識別子、タイムスタンプ、「Embedded debugging」、対象範囲(ターゲット、SW バージョン)。
- レイヤー 1 — サマリーバナー(常に表示): 4~5 個の数値を 1 行で表示します。症状の分類、仮説の数、影響を受ける要素、収集するデータ項目、安全性への影響フラグ(はい/いいえ)。2 秒で把握できる内容にします。
- レイヤー 2 — グループ化されたテーブル(一覧性を重視): 仮説(または根本原因候補)ごとに 1 行を設けます。列は必要最小限にします。順位、仮説の一行要約、可能性チップ(高/中/低)、影響を受ける要素、「次の手順を定義済み」のインジケーター。行内に詳細な説明は記載しません。検索/フィルターボックスと、並べ替え可能な列を含めます。
- レイヤー 3 — 展開可能な詳細(
<details>、デフォルトでは折りたたみ): 仮説ごとに、裏付けとなる証拠、確認または反証する方法(ツールコマンド/レジスターの読み取り/コード位置)、疑わしいコードパターンを記載します。 - フッター(簡潔に): 制限事項、確認できなかったこと、推定データに関する免責事項。
スタイル: 自己完結型の .html ファイルを 1 つ作成し、CSS はインラインで記述します。並べ替え/フィルタリング用の小さなスクリプトを 1 つ使用し、外部の CSS/JS/フォント依存は含めません。ASCII のみを使用し、em ダッシュは使いません。可能性とステータスは、テキストを大量に並べるのではなく、小さな色付きチップで表示します。迷った場合は詳細をレイヤー 3 に移し、レイヤー 1~2 は最小限に抑えます。ひな形には references/html-report-template.html を使用します。ヘッダー、レイヤー 1 の統計セル、仮説ごとに 1 行の簡潔なテーブル行、仮説ごとに 1 つの折りたたまれた <details> ブロックを埋めてください。
保存先:
- 作業ディレクトリから上の階層へたどり、
.gitまたはその他の明確なプロジェクトマーカーを探して、プロジェクトルートを検出します。 - プロジェクトルートが見つかった場合:
<project-root>/analysis/に書き込みます。フォルダーが存在しない場合は作成します。 - プロジェクトルートがない場合(プロジェクト外で実行されたグローバルインストールが想定されます):ホームディレクトリや現在の作業ディレクトリに推測で書き込んだり、黙って書き込んだりしないでください。
analysis/の作成先を一度だけ尋ね、デフォルトとして現在のディレクトリの./analysis/を提示します。選択内容はセッション中保持します。 - 書き込んだ正確なパスを必ず報告します。
- git リポジトリが検出され、
analysis/がまだ無視対象になっていない場合は、analysis/を.gitignoreに追加するよう提案します。
ファイル名:analysis/embedded-debugging-<short-timestamp>.html(例:embedded-debugging-20260621-1930.html)。繰り返し実行しても上書きされないようにします。