Flutter: 「Terminated due to signal 9」でXcodeと実機の接続が切れ、以降のログを確認できない
結論:toastを使ってdebugPrintで見たい内容を画面に表示させる
2022/12/24 Flutter エラー・バグ日記
エラー発生の原因を探るべく、iOS実機でXcodeからデバッグ操作中、特定の動作で必ずXcodeとの接続が切れてしまい、以降のログが確認できない状況に陥った。
アプリ自体はクラッシュしていない。
Xcode上のコンソールログを確認すると、最後に以下の一文が表示されている。
Message from debugger: Terminated due to signal 9
バックグラウンド移行中に負荷が高まると発生する模様
エラーメッセージがシンプルすぎて、原因の見当がつかず、、。
ググってみると、以下のような記事が見つかった(大変参考になります!m(_ _)m)
どうやらアプリがバックグラウンド(サスペンド)状態に移行した時に、不要な処理を継続していると、負荷が高まって接続が切れる模様。
自分のケースでは、「permission_handler」の「openAppSettings」メソッドを使って、iOSの設定画面を開き、設定変更後にアプリに戻ってくる所で発生していた。
恐らく、iOSの設定画面を開いている最中に、アプリ側がバックグラウンド状態となり、その間に負荷オーバーになったと思われる。
詳細はXcode上のログで確認できる
上記記事を参考に、Xcodeのメニューの「Window」 →「Devices and Simulators」→「Devices」タブを見ることで、ログを確認してみた。
CPUの利用率が50%を超える状態が180秒続いたため、ということらしい。
ただ、ログからは、バックグラウンド中に「何をしたのがまずかったのか?」という情報は、探れず。。
debugPrintを見れないのが困る。。暫定処置を模索
アプリはクラッシュしないため、Xcodeとの接続切れ自体はいったん置いておくとしても、コンソールでdebugPrintの結果を確認できないので、目的としていたエラー対応が続けられず、詰まる。。
ログが見れないときの対処法をググってみるも、参考になりそうな情報は見つけられず。
考えた結果、暫定処置として、本来debugPrintでコンソールに表示させたい内容を、toast(画面上に出す一時的なポップアップメッセージ)で表示させることにした。
初めは、ログ内容をText Widgetで画面表示しようかとも思ったが、レイアウトに影響したり、値の変更をウォッチするのに再描画が必要だったりするのが厄介だと思った。
それに比べ、toast機能は自由なタイミングで画面に表示できるので、値の変化もウォッチもしやすい。
toastを利用できるパッケージは様々あるが、自分は「oktoast」を使っている。
「MaterialApp」を「OKToast」クラスでラップしておけば、どこでもcontext不要でtoastを表示でき、また表示位置のカスタマイズもしやすいため、愛用している。
以下のような形で、debugPrintのログを表示したい場所に、toastを表示させるメソッドを埋め込んだ。
showToast( "valueOの値: $valueO", position: ToastPosition.bottom, duration: const Duration(seconds: 3), );
結果、下図のように、アプリ画面上で値の変化やログを確認でき、無事、目的とするエラーの解消に役立てることができた。
知識不足ゆえ、このような対処法しか思いつかず、、恐らくもっと別の方法があると思われるが、いったん解決したので、良しとしておこう。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/