Chapter 08
デバッグポート経由の観測 — グレーボックスという反則
この章のゴール.
SWD/JTAG が使える場合に、ブラックボックスを一部グレーボックス化して観測を強力にできること、 ただしそれが「製品の状態」とは限らない前提と、非侵襲的なトレース観測の使い方を理解すること。
この章で使う既出の用語(定義は各リンク先). オラクル(01 章 8 節)、刺激(02 章 1 節)、電源(02 章 2 節)、UART(05 章 1 節)、エラー処理(06 章 6 節)
1. デバッグポートは「半分中が見える」
03 章〜07 章は完全に外からの観測だった。だが開発中の機器にはデバッグポート(SWD、JTAG)が生きていることが多い。 ここを使うと、実行を止めずにメモリ・レジスタ・変数を覗く、特定関数で止める、トレースを取ることができる。純粋なブラックボックスではなくなるが(グレーボックス)、テストの観測力とデバッグ効率が跳ね上がる。
- 観測点として: 「内部状態変数」を直接読めば、UART ログを出させる必要がない
- 刺激点として: メモリを書き換えて状態を強制する、関数を呼ぶ
- 詳細はバイナリ編 04 章・17 章(ダンプ・動的解析)と重なる。本章はテスト観点
2. 何ができるか
| 機能 | テストでの使い方 |
|---|---|
| メモリ/変数の読み出し | 内部状態をオラクルの観測点に。UART を汚さず高頻度に読める |
| メモリ書き込み | 状態を強制注入(テストの前提づくり)、フォールト注入 |
| ブレークポイント | 「この関数に到達したか」「異常経路を通ったか」を検出 |
| ウォッチポイント | 「この変数が書き換わった瞬間」を捕まえる |
| RTT / SWO トレース(後述) | 実行を止めずにログ・変数を高速に流し出す |
| コアダンプ | クラッシュ時の状態を丸ごと(バイナリ編 17 章) |
道具は OpenOCD/pyOCD + gdb、J-Link(pylink)、各社 IDE。pyocd は Python から read_memory/write_memory ができ、自動テストに組み込みやすい。
from pyocd.core.helpers import ConnectHelper
with ConnectHelper.session_with_chosen_probe() as session:
t = session.target
val = t.read_memory(0x20000100) # 状態変数のアドレス(マップから、バイナリ編 [05 章](../binary/05_ELFファイル.md))
assert val == EXPECTED_STATE3. 止めない観測 — RTT と SWO
ブレークで止めると、リアルタイム性が壊れて無線が切れる・タイミングが変わる。止めずに観測する手段が重要。
- SWO(Serial Wire Output)/ ITM: Cortex-M が持つ、実行を止めずにデータを吐く単方向トレース。
printfを SWO に流せば、UART より速くログが取れる - RTT(Real-Time Transfer、SEGGER): RAM 上のリングバッファを介して、止めずに双方向にログ・コマンドをやり取りする。UART の速い版として広く使われる
- ETM(トレースマクロセル): 実行した命令の完全なトレース(高価なプローブが要る)。カバレッジ・タイミング解析に
止めない観測は、タイミングを乱さずに内部を見るための鍵である(観測が対象を乱す問題への対策、14 章)。
4. グレーボックスの落とし穴 — 「開発機 ≠ 製品」
デバッグポートで見た振る舞いが、出荷される製品の振る舞いとは限らない。
- 製品ではデバッグポートが無効化・ロックされる(読み出し保護、PSA/iotsec 編)。「開発機では動くが製品では違う」ことがある
- デバッグ接続そのものが動作を変える: クロック、電源(デバッガから供給)、タイミング
- ブレークで止めると無線プロトコルはタイムアウトで切れる(BLE は数百 ms で)
だから、最終的な受け入れは純粋なブラックボックスで行い、グレーボックスは開発中の観測・原因究明に使う、と役割を分ける。 「デバッグポートが製品でちゃんとロックされているか」自体もブラックボックスのテスト項目である(17 章)。
5. フォールト注入の下見
デバッグポートは、わざと壊すテストの入口にもなる。
- メモリを書き換えて異常状態を作り、回復するか(16 章)
- 特定の分岐を強制して、めったに通らないエラー処理を実行させる(カバレッジ)
- スタック・ヒープを汚してガード(スタックオーバーフロー検出)が働くか
これは電源グリッチ・電磁フォールト(17 章のサイドチャネル/フォールト)の「配線でできる版」で、安全に異常系を試せる。
6. 何をオラクルにするか
- 内部状態変数が期待どおり(高頻度・低侵襲に読める)
- 異常経路に到達しないこと(ブレークが踏まれない)/すべき経路に到達すること
- 強制した異常状態から回復する
- 製品でデバッグポートが閉じている(セキュリティ)
7. 手を動かす
止める観測と止めない観測
この章のポイント
- デバッグポート(SWD/JTAG)はブラックボックスを一部グレーボックス化し、内部状態を直接観測・注入できる
- 止めない観測(SWO/ITM、RTT、ETM)が鍵——ブレークはリアルタイム性と無線を壊す
- 開発機 ≠ 製品: 製品ではロックされる。最終受け入れは純ブラックボックスで、グレーは原因究明に
- フォールト注入・カバレッジの入口。強制状態からの回復を試せる
- 「デバッグポートが製品で閉じているか」自体がテスト項目