Renode という QEMU に似たオープンソースのエミュレータを試しています。
前回 は、STM32 のサンプルアプリを対象として、GDB でデバッグする代わりに、VSCode を使ってデバッグするところまで行いました。
今回は、STM32 のサンプルアプリではなく、サンプルアプリが動いている Renode 自体をデバッグする環境を構築していきます。
それでは、やっていきます。
はじめに
「QEMUを動かす」の記事一覧です。良かったら参考にしてください。
・第2回:STM32(ARM Cortex-M)をQEMUで動かす(ソースコード確認編)
・第3回:STM32(ARM Cortex-M)をQEMUで動かす(スタートアップルーチン編)
・第4回:STM32(ARM Cortex-M)をQEMUで動かす(リンカスクリプト編)
・第5回:STM32(ARM Cortex-M)のELFファイルの内容を確認する
・第6回:STM32(ARM Cortex-M)のELFファイル⇔バイナリの変換を行う
・第7回:STM32(ARM Cortex-M)のバイナリから構築したELFファイルをQEMUで動かす
・第8回:QEMUのビルドに必要なxpm(xPack Project Manager)について学ぶ
・第9回:QEMUをソースからビルドして動かす
・第10回:QEMUのソースコードを変更してSTM32の動作を変える
・第11回:QEMUに似たRenodeというOSSの組込みデバイスエミュレータを試す
・第12回:QEMUに似たRenodeでSTM32をGDBを使ってデバッグする
・第13回:QEMUに似たRenodeでSTM32をバイナリファイルで動かす
・第14回:QEMUに似たRenodeをソースからビルドする
・第15回:QEMUに似たRenodeでVSCodeを使ってデバッグする
・第16回:QEMUに似たRenodeでVSCodeを使ってRenode自体をデバッグする ← 今回
まず、Renode の公式サイトは以下です。
Renode の公式のドキュメントは以下です。
https://renode.readthedocs.io/en/latest/
また、GitHub は以下です。
https://github.com/renode/renode
今回は、Renode 自体を VSCode でデバッグします。
VirtualBoxのUbuntu22.04にVSCodeをインストールする
Windows で起動した VSCode からリモートエクスプローラを使って、Renode をデバッグしてみましたが、なぜかうまくいきませんでした。
そこで、VirtualBox の Ubuntu 22.04 に VSCode をインストールして、直接 Ubuntu 22.04 上で VSCode を使ってデバッグします。
まず、Ubuntu 用の VSCode をダウンロードします。
ダウンロードできたら、apt を使ってインストールします。
$ sudo apt install ./code_1.89.1-1715060508_amd64.deb
ダウンロードが完了したらアクティビティ?(スタートメニュー?)に Visual Studio Code のアイコンが追加されるので、クリックして起動します。

フォルダを開こうとしたら、下図のように、だいぶおかしいです。

仕方ないので、端末(コンソール)からフォルダを指定して起動します。
$ cd renode
$ code .
無事、フォルダを開いた状態で起動できました。
VirtualBox の Ubuntu 22.04 に VSCode をインストールする手順は以上です。
Renode自体をVSCodeでデバッグする
Renode の公式ドキュメントの導入の Renode の開発に、Renode 自体をデバッグする方法が書かれているので、それに従ってやってみます。
-d オプションを付けて、再ビルドが必要なようです。
$ ./build.sh -d (省略) Build succeeded. Warnings: /home/daisuke/svn_/renode/renode/Renode.sln (default targets) -> (Build target) -> /home/daisuke/svn_/renode/renode/src/Infrastructure/src/Emulator/Peripherals/Peripherals.csproj (default targets) -> /usr/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets (CoreCompile target) -> /home/daisuke/svn_/renode/renode/src/Infrastructure/src/Emulator/Peripherals/Peripherals/DMA/STM32WBA_GPDMA.cs(472,40): warning CS0649: Field 'STM32WBA55_GPDMA.Channel.triggerOverrunInterruptEnable' is never assigned to, and will always have its default value null 1 Warning(s) 0 Error(s) Time Elapsed 00:03:55.0974530
エラー無くビルドが完了しました。
前回 見たように、.vscode/launch.json には、Renode 自体のデバッグの設定が用意されています。
launch.json を以下のように、少し変更しました。変更したのは、デバッグビルドは既に完了してるので、preLaunchTask を削除したのと、デバッガが起動したら停止するようにしました(どっちが効くのか分からなかったので両方記述しました)。
{ "version": "0.2.0", "configurations": [ { "name": "Launch - Debug", "stopOnEntry": true, "stopAtConnect": true, "type": "mono", "request": "launch", "program": "${workspaceRoot}/output/bin/Debug/Renode.exe", "cwd": "${workspaceRoot}", }, ] }
では、Renode をデバッグ起動していきます。
どこかにブレークポイントを設定しておきます。今回は、前に少しだけ確認した LoadELF関数にブレークポイントを設定してみます。src/Infrastructure/src/Emulator/Main/Peripherals/Bus/SymbolLookup.cs の 181行目あたりです。
Launch - Debug を設定して、デバッグを開始します。
そうすると、Mono Debug をインストールしますか?と聞かれるので、はいを選択します。
しばらくすると、Renode モニターが起動します。いつも通り、環境を設定します。
(monitor) i @renode-config.resc
すると、先ほど設定したブレークポイントで停止しました。ステップ実行が出来ますし、変数の値も見れます。デバッグ環境が構築できました。

おわりに
今回は、簡単な手順で、Renode 自体を VSCode でデバッグできるようになりました。
次回は、Renode の他の機能を試してみたいと思います。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。