16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RaspberryPi(Raspbian)上で動く.NET Core2.1アプリをリモートデバッグする

Last updated at Posted at 2018-10-26

はじめに

こんにちは。

スマートメーターからBルートでデータ取りたくて、Raspberry Pi 3 Model B+を購入しました。

自称C#erなのに.NET Coreは食わず嫌いでしたが、
ラズパイに.NET Framework入らないので、.NET Coreで開発しようとおもいます。
(Bルートのアプリはまだ開発中です。)

Raspbian(arm32)上で.NET Coreを動かす記事はいくつかありましたが、
リモートデバッグについては最近できるようになった?ようで、
日本語の情報がみつからなかったので自分のメモとして残します。

最近覚えたコト

.NET Core 開発・実行

  • .NET Core SDK=Javaで言うJDK
  • .NET Core Runtime=Javaで言うJRE

.NET Core アプリの展開

  • フレームワークに依存する展開 (FDD)
    • .NET Core Runtimeがある前提のやつ
    • マルチプラットフォーム
    • dotnet MyConsoleApp.dllみたいに起動する
  • 自己完結型の展開 (SCD)
    • exeつくるやつ(.NET Core Runtimeなしで動く)
    • プラットフォーム毎
    • dotnet publish -r linux-armみたいな→RID

間違ってても許してください。やさしく教えてください。

いろいろ前提条件 事前準備

  • ハード:Raspberry Pi 3 Model B+
  • OS:RASPBIAN STRETCH WITH DESKTOP
    • 開発PCから接続可能なLANの構成
    • SSHの有効化
    • sambaでファイル共有的なやつ

Linux/ラズパイ 素人なので、チュートリアル系記事読んで済ませました。
落としてきたイメージ書き込んで、wpa_supplicant.conf作って、sshファイル配置しました。

環境構築

開発側(Windows)

Visual Studio Codeの場合

  1. PuTTYいれます
  2. .NET Core 2.1 SDKいれます
  3. Visual Studio Codeいれます
  4. Visual Studio Codeの拡張機能いれます

Visual Studio 2017(15.4以降)の場合

  1. PuTTYいれます
  2. Visual Studio Installerで.NET Core クロスプラットフォームの開発ワークロードを有効にします。

ラズパイ側

.NET Core 2.1 Runtimeいれます

"このへん"とか"このへん"とか見ても、ARM64だしARM32の情報がなかなか見つからず。
コピペでいけないとLinuxド素人にはつらい。
探すこと1時間 ↓にたどりつきました。

ランタイムはここRuntime Binaries>Linux>ARMからURLを拾ってきます。
SDK Binaries>Linux>ARMってのもあるけど、Raspbian上でビルドできるんです…?

.NETCoreRuntime2.1.5
sudo apt-get -y install libunwind8 gettext
curl -sSL -o dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/4d555219-1f04-47c6-90e5-8b3ff8989b9c/0798763e6e4b98a62846116f997d046e/dotnet-runtime-2.1.5-linux-arm.tar.gz
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
dotnet --list-runtimes

vsdbgいれます

リモートデバッガ

curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -r linux-arm -v latest -l ~/vsdbg

プロジェクト作成~デバッグまで

Visual Studio Codeの場合

  1. コンソールプロジェクトを作成
  • 開発PCで dotnet new console -n MyConsoleAppする
  • VSCodeでMyConsoleAppフォルダを開く
  • C#拡張がRequired assets to build and debug are missing from 'MyConsoleApp'. Add them?って聞いてくるので、Yes!
    • .vscode\launch.jsonが作成されます。
  1. ビルド
  • とりあえずF5して実行してみる。→Hello World!
  • 開発PCのVSCodeで、dotnet publish(FDDです)
  1. デプロイ
  • SMB経由で、開発PCからbin\Debug\netcoreapp2.1\publishフォルダをラズパイにコピー
  1. launch.jsonの追記
    以下のように追記します。
launch.json
{
    "name": ".NET Core Remote Launch - Framework Dependent (console)",
    "type": "coreclr",
    "request": "launch",
    "program": "/opt/dotnet/dotnet",
    "args": [
        "./MyConsoleApp.dll"
    ],
    "cwd": "~/publish(コピー先のパス)",
    "stopAtEntry": false,
    "console": "internalConsole",
    "pipeTransport": {
        "pipeCwd": "${workspaceRoot}",
        "pipeProgram": "c:\\Program Files\\PuTTY\\plink.exe",
        "pipeArgs": [
            "-pw",
            "パスワード",
            "pi@192.168.xxx.xxx"
        ],
        "debuggerPath": "~/vsdbg/vsdbg"
    }
}

実際は鍵でSSHしてます よ。

  1. Debug
  • VSCodeのデバッグ(Ctrl+Shift+D)を開きます
  • 実行対象の構成 NET Core Remote Launch - Framework Dependent (console)を選択
  • F5!
Starting: "c:\Program Files\PuTTY\plink.exe" -pw Password pi@192.168.xxx.xxx "~/vsdbg/vsdbg --interpreter=vscode"
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Private.CoreLib.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Loaded '/home/pi/publish/MyConsoleApp.dll'. Symbols loaded.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Runtime.dll'. Module was built without symbols.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Console.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Threading.dll'. Module was built without symbols.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Runtime.Extensions.dll'. Module was built without symbols.
Hello World!
The program '[3550] dotnet' has exited with code 0 (0x0).
Error from pipe program 'plink.exe': Process is terminating due to StackOverflowException.

#plink.exeがStackOverflowExceptionとなるのはなぜかよくわかってない

Visual Studio 2017の場合

  1. コンソールプロジェクトを作成
  • 開発PCで 新しいプロジェクト
  • Visual C#>.NET Core>コンソールアプリ(.NET Core)
  • とりあえずF5して実行してみる。→Hello World!
  1. ビルド&デプロイ
  • プロジェクトファイルを右クリックして発行
    • 構成がReleaseになってると思うので、Debugに変更
    • ターゲット(発行先)はSMB経由で、ラズパイ充てで
  1. launch.jsonの作成
    以下のように記述します。(保存先やファイル名は何でもいいです)
launch.json
{
    "version": "0.2.0",
    "adapter": "C:\\Program Files\\PuTTY\\plink.exe",
    "adapterArgs": "-pw パスワード pi@192.168.xxx.xxx -batch -T ~/vsdbg/vsdbg --interpreter=vscode",
    "configurations": [
        {
            "name": ".NET Core Launch",
            "type": "coreclr",
            "cwd": "~/publish(コピー先のパス)",
            "program": "/opt/dotnet/dotnet",
            "args": [
                "./ConsoleApp1.dll"
            ],
            "request": "launch"
        }
    ]
}

実際は鍵でSSHしてます よ。

  1. Debug
  • 以下のコマンドを、VSのコマンドウィンドウ(Ctrl+W,A)に打ち込みます
デバッグ開始
DebugAdapterHost.Launch /LaunchJson:"launch.jsonの保存先(フルパス)"
実行結果
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Private.CoreLib.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Loaded '/home/pi/publish/ConsoleApp1.dll'. Symbols loaded.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Runtime.dll'. Module was built without symbols.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Console.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Threading.dll'. Module was built without symbols.
Loaded '/opt/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Runtime.Extensions.dll'. Module was built without symbols.
Hello World!
The program '[9933] dotnet' has exited with code 0 (0x0).
プログラム 'dotnet' はコード 0 (0x0) で終了しました。

よくわかってない点

  • VS2017でF5で開始できないものでしょうかね
  • VSCodeとVS2017のlaunch.jsonの違い。アダプタホストが異なるから?
    • launch.jsonのドキュメントってないんですかね。

#参考にしたもの

おわりに

スマートメーターからデータ取りたくて、Wi-SUNドングル↓を買ったので、
これからシリアル通信と格闘です。
Wi-SUNモジュール, Wi-SUN Route-B 専用 RL7023 Stick-D/IPS

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?