🖥

Visual Studioでラズパイをデバッグしよう

2024/03/23に公開

.NETでラズパイのアプリケーションを開発できることを知りました。
また、Visual Studioを使ってデバッグ(ブレーク、ウォッチ等)ができることを知りました。
開発環境の構築について、備忘録として記載します。

作業の流れ

  • ① ラズベリーパイのセットアップ
  • ② ホストマシンにて、コードを作成
  • ③ ホストマシンにて発行を行い、プログラムをラズパイへ配置
  • ④ ターゲットにて、プログラム(プロセス)を実行
  • ⑤ ホストマシンからプログラム(プロセス)へアタッチ
  • ⑥ ホストマシンからデバッグ作業

環境

  • ホストマシン
    • Windows 11 Home
      • 23H2
    • Visual Studio
      • Community

https://visualstudio.microsoft.com/ja/vs/community/

  • ターゲット
    • RaspberryPi 4B
      • Linux pi4home 5.15.32-v8+ #1538 SMP PREEMPT Thu Mar 31 19:40:39 BST 2022 aarch64 GNU/Linux
    • 説明の便宜上、ユーザ名/IPアドレスは下記で説明
      • ユーザ名 : pi
      • IPアドレス : 192.168.11.60

手順

作業の流れに沿って、記載します。

① ラズベリーパイのセットアップ

  • SSHの有効化
  • .NETのインストール
  • sambaの設定

SSHの有効化

  • GUIまたは、raspi-configコマンドよりSSHを有効化する
    • コマンドの場合は、"Interface Options" -> SSH を選択し、有効化
  • teraterm等で接続を確認する

.NETのインストール

  • 下記のコマンドより.NETをインストールする
    $ curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel LTS
    
    • 2023.03.20時点では、.NET8がインストールされる(注釈参照)
  • 環境変数を追加する
    $ echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
    $ echo 'export PATH=$PATH:$HOME/.dotnet' >> ~/.bashrc
    $ source ~/.bashrc
    
  • インストールを確認する(バージョンを確認)
    $  $ dotnet --version
    8.0.203
    

sambaのインストール、設定

  • ホストマシンからファイルの読み書きをするためにsambaをインストールする
    $ sudo apt-get update
    $ sudo apt-get install samba
    
  • sambaの設定ファイルをエディタで開く
    $ sudo vi /etc/samba/smb.conf
    
  • 下記を追加し、保存する
    [raspberrypi]
      comment = Raspberry Pi
      path = /home/pi
      public = yes
      guest ok = yes
      read only = no
      browsable = yes
      force user = pi
      strict sync = yes
    
  • sambaを再起動させる
    $ sudo service smbd restart
    
  • アクセスを確認する
    • ホストマシンからアクセス(読み込み、書き込み)を確認

② ホストマシンにて、コードを作成

簡単なコードで確認する

  • "新しいプロジェクトの作成"を選択
  • "コンソール アプリ"を選択して、"次へ"を選択
  • プロジェクト名の構成を入力し、"次へ"を選択
      • "HelloPi"は任意の名前で可
  • ".NET8.0(長期的なサポート)"を選択し、"作成"を選択
    • ラズパイにインストールした.NETのバージョンとフレームワークを合わせることが重要
  • コードは下記とする
    namespace HelloPi
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 1000; i++)
                {
                    if (i % 2 == 0)
                    {
                        Console.WriteLine($"{i} is even");
                    }
                    else
                    {
                        Console.WriteLine($"{i} is odd");
                    }
                    Thread.Sleep(1000);
                }
            }
        }
    }
    
    • 便宜上、プログラムがすぐに終了しないようにしている
  • ホストマシンで実行すると、下記の出力がされる
    0 is even
    1 is odd
    2 is even
    3 is odd
    4 is even
    5 is odd
    ...
    

③ ホストマシンにて発行を行い、プログラムをラズパイへ配置

  • ラズパイ側でプログラムを配置するディレクトリを作成する
    $ mkdir HelloPi
    $ cd HelloPi
    $ pwd
    /home/pi/HelloPi
    
    • 任意のディレクトリで可
  • Visual Studio側で、プロジェクトを選択し、"発行"を選択
  • "フォルダ"を選択し、"次へ"
  • "フォルダ"を選択し、"次へ"
  • "\192.168.11.60\raspberrypi\HelloPi"を指定し、"完了"
  • デバッグが目的のため、"すべての設定を表示" -> "構成"にて"Debug | Any CPU"を選択し、"保存"
  • "発行"を選択
  • ラズパイ側にビルド結果が配置される

④ ターゲットにて、プログラム(プロセス)を実行

  • ラズパイ側でHelloPiを実行する

⑤ ホストマシンからプログラム(プロセス)へアタッチ

  • Visual Studio側で、メニューバー"デバッグ" -> "プロセスにアタッチ"を選択
  • "接続の種類"を"SSH"、"接続先"をラズパイのIPアドレスを入力後、"更新"を選択
  • "ユーザ名"、"認証の種類"、"パスワード"を入力し、"接続を選択"
    • ※警告がでますが、ぞうっこう
  • 使用可能なプロセスから、dotnetのプロセスを選択し、"アタッチ"
  • "マネージド(Unix用 .NET Core)"を選択し、"OK"
  • エラーが出なければアタッチ完了

⑥ ホストマシンからデバッグ作業

  • アタッチができていれば、ブレークを入れると停止できる

ステップ実行、ウォッチなど一連の機能が使えます🎉

その他

再アタッチ

  • 一度アタッチすれば、次からは再アタッチできる

自己完結型の指定

  • 自己完結型を指定すると、.NET ライブラリやターゲット ランタイムなど、アプリのすべてのコンポーネントが格納される
    • この場合、ターゲットのプラットフォームを指定する必要がある
    • 上記状態の場合、各ライブラリ群も配置される

参考文献

  • Microsoft - .NET の IoT ライブラリのドキュメント

https://learn.microsoft.com/ja-jp/dotnet/iot/deployment

  • Qiita - Raspberry PIでDotNet環境を構築

https://qiita.com/neomi/items/1e2b955207425b4f63bf

GitHubで編集を提案

Discussion