flutter windows desktopのnative pluginデバッグ②
前回はVSCodeとVisualStudio2022でネイティブプラグインのデバッグを確認したが、VSCodeの方はできれば同時に起動させたい。つまりdartをホットリロードできる環境ながらプラグインにもブレークポイントがはりたいということ。
ネイティブプラグインはC++なので再ビルドが必要なのはしょうがない。
flutter runで起動後にアタッチする方法
わりとすんなりできた方法としてFlutter Appを起動(flutter runもしくはF5で起動)後に、それに対してgdbをアタッチする方法
手順
lauch.jsonのconfigurationsに以下を追加
code:launch.json
{
"name": "test_plugin",
"request": "launch",
"type": "dart"
},
// 中略
// 以下追加部分
{
"name": "Debug Native Attach",
"type": "cppvsdbg",
"request":"attach",
"processName": "test_plugin_example.exe",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "C:/Program Files/mingw64/bin/gdb.exe"
}
「実行とデバッグ」でまずtest_plugin(flutter app側)を起動する。その後”Debug Native Attach"を選択し、もう一度起動ボタンを押す
https://gyazo.com/426f59f3a3c1d25a1e08d2f5bd82e67f
そうすると複数起動しているのが確認できる
https://gyazo.com/41e6f2a1dab114fc200721a7fe027a5d
その後、ちゃんとアタッチできているか確認するためにexample/lib/main.dartに以下のようにメソッドを呼ぶボタンを追加した
code:main.dart
body: Center(
child: Text('hoge hoge Running on: $_platformVersion\n'),
),
// 以下追加部分 ボタンを押すとnative pluginのメソットが呼ばれるように
floatingActionButton: FloatingActionButton(
onPressed: initPlatformState,
tooltip: 'lib test',
child: const Icon(Icons.add),
),
ボタンを押すとブレークポイントで止まることを確認する
感想
dartとcppを同時にデバッグすることができることがわかった
アタッチをプロセス名で行っているが複数同じ名前を起動すると問題がありそうなのをなんとかしたい
手動アタッチだと起動直後は取れないので、できれば起動時にそのままアタッチしたい
ちなみに"processId": "${command:pickProcess}",とするとアタッチするプロセスを選ぶことができる
手動でアタッチするのが面倒なのでdartの開発時にネイティブの挙動を調べたくなった時用
ネイティブ開発の場合は次に書く"ビルドを行ってからアタッチする"をみる
上記の問題に関して色々調べてみたメモ書き
複数実行を自動でする方法"vscode compounds"などと調べる
しかし情報は多くない
試したが、flutterの起動を待たずにprocessIdを選択画面がでるので結局色々待たないといけない
process idを取得する方法
外部のスクリプトを実行してpidに入れ込む方法
compoundでflutterの起動を待てない限りは無理
ビルドを行ってからアタッチする
上のままだとcpp側の開発時にいちいち起動後にアタッチしないといけなくて面倒なのでできれば自動でやる
.vscoe/task.jsonに次のようなタスクを追加する
code:task.json
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "flutter build for windows (debug)",
"command": "flutter",
"args": [
"build",
"windows",
"--debug"
],
"options": {
"cwd": "${workspaceFolder}/example"
},
"problemMatcher": [],
"detail": ""
}
]
}
そして先程の.vscode/launch.jsonに以下のタスクを追加し、"Debug Native"をデバッグ開始
code:launch.json
{
"name": "Debug Native",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/example/build/windows/runner/Debug/test_plugin_example.exe",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "C:/Program Files/mingw64/bin/gdb.exe",
"preLaunchTask": "flutter build for windows (debug)"
}
やっていることとしてはflutter runではなくビルドをするタスクを作成し、preLaunchTaskとして登録するとデバッグ開始の前にかならずビルドをすることができる。ただしこの状態だとflutter側のデバッグができないのがネック
windows側の開発に注力するときはこっち。
しかしビルドが遅い。