コンテンツにスキップ

デバッグ

2.0 で追加。動いているアプリを止めて中を見る方法が 2 つあります。実機のエディタに内蔵された デバッガと、パソコンから TCP か BLE でつなぐ遠隔デバッガです。

どちらも実機でも シミュレータ でも使えます。

実機だけで: エディタ内蔵のデバッガ

エディタ (デスクトップで E) だけで、パソコンを使わずにデバッグできます。

メニューバーに Debug を持つ FM-Editor

実行

F5 で、編集中のファイルをそのまま実行します。保存して起動し直す手間はありません。

対象に接続する

Debug → Attach... で動いているアプリの一覧が出ます。選ぶとエディタが分割され、 本文の下に呼び出し履歴と変数の欄が出ます。

接続すると本文の左に停止点の欄が出ます。

キー 動作
F5 再開
F6 一時停止
F10 次の行へ (中に入らない)
F11 中に入る
Shift + F11 呼び出し元へ戻る
F7 / F8 呼び出し履歴を上下に移動
F4 呼び出し履歴の欄と変数の欄を切り替え

Debug メニューにも同じ操作があり、加えて現在行に停止点を置く Toggle BP と、 終了する Detach があります。

停止点は左の欄に赤い丸で表示され、止まっている行は強調表示されます。

デバッガは同時に 1 つだけ

1 台につきデバッグの接続は 1 つです。エディタが接続していると遠隔デバッガは接続できず、 逆も同じです。切り替えるときは先に切断してください。

パソコンから: 遠隔デバッガ

実機ではデバッグ用のサービスが動いていて、msgpack の手順で次のどちらかの経路を使います。

経路 対象
TCP Linux のシミュレータと、ネットワークで届く対象
BLE ESP32 の実機。GATT 経由なのでケーブルが要りません

デバッグ用のサービスに認証はありません

どちらの経路も、接続してきた相手を確認しません。TCP はすべての接続元を受け付け、 BLE はペアリングも暗号化も行いません。実機に届く人なら誰でも、動いているアプリに 接続して変数の中身を読み、アプリを止めたり起動したりできます。信頼できる環境で 使ってください。セキュリティ も参照してください。

コマンドから使う

リポジトリの tool/debug/fmrb_dbg_client.py は、ライブラリでもあり、対話的に使える 小さな道具でもあります。

# 1 つのコマンドだけ実行する
python3 tool/debug/fmrb_dbg_client.py localhost:5555 stack_trace

# 対話的に使う
python3 tool/debug/fmrb_dbg_client.py localhost:5555

# BLE で、見つかった 1 台につなぐ
python3 tool/debug/fmrb_dbg_client.py ble

対象の指定は、TCP なら host[:port] (既定の port は 5555)、BLE なら ble、複数台ある 場合は ble:<名前かアドレス> です。

msgpack パッケージが必要です。BLE を使う場合は bleak も要ります。

DAP に対応した編集環境から

tool/debug/fmrb_dap_adapter.py は、同じ仕組みに Debug Adapter Protocol の入口を つけたものです。DAP に対応した編集環境 (VS Code など) から、動いている実機に対して 停止点を置き、1 行ずつ進め、変数を見られます。

web コンソールのデバッグ欄

ブラウザから BLE でつなぐ web コンソール には、大まかな操作の ための欄があります。動いているアプリの一覧 (ps)、終了、起動ができます。おかしくなった アプリを落とすだけなら、デバッガを持ち出すよりこちらが速いです。

システムが自分について出しているもの

停止点を置かないと分からない問題ばかりではありません。システムは自分の状態を定期的に 出していて、たいていはその数値のほうが早く原因にたどり着きます。

  • システムメニューの Log Viewer で実機のログが読めます
  • 定期的な出力に、各タスクのスタックの残り、VM の領域の使用量、描画の所要時間が出ます
  • システムメニューの Monitor で、動いているタスクとメモリが一目で分かります

メモリが足りなくなるアプリなら、どの領域がどこまで詰まっているかはこの出力にしか 出ません。デバッガでは分かりません。

関連