VisualStudio 2017 RC3からリモートデバッグのプロトコルにSSHが選択できるようになり、Linux上の.NET Coreプロセスにアタッチすることができるようになりました*1。
これは、以前ブログに書いたdocker上の.NET Coreプロセスをリモートデバッグするのと同じ仕組みだと思われます。
で、MSDNブログではUbuntuが取り上げられていますが、RHELでもできることを確認したのでその手順をまとめておきます。現状では、VisualStudioで発行したバイナリを転送して実行するのが一番速そうです。これはWindowsとRHELの.NET Core SDKがまだVisual Studio 2017 RC3のcsprojの構造に追い付いていないようで、VisualStudioで認識できるプロジェクトをdotnet
コマンドでビルドできなかったからです*2。
まず、RHEL側の準備ですが、.NET Core 1.1をインストールしておきます。
Chapter 1. Install .NET Core 1.1 on Red Hat Enterprise Linux - Red Hat Customer Portal
つぎに、以前dockerにリモートデバッグする場合はclrdbgをインストールしておきましたが、新しいVisualStudioの機能を使う場合は接続時に必要に応じてインストールしてくれるので事前にインストールしておく必要はありません。その代わりインストールに必要なコマンドとして、unzipとcurlもしくはwgetのインストールが必要です。curlやwgetは割とインストールされていることが多いと思いますが、unzipが入っていないことがあるのでいれておきましょう。sshサーバーの設定も必要なので、こちらを参考にどうぞ。
$ sudo yum install openssh-server unzip curl
次にVisualStudio側でプロジェクトを作成します。今回は.NET Core 1.1でASP.NET Core Webの空アプリケーションを作成しました。作成した後、プロジェクトを右クリックして「公開」を選び、発行先にフォルダーを選びます。
デフォルトだとReleaseビルドになるので、Debugビルドに直しておきます。
あとは発行ボタンを押して実行用のバイナリを生成します。
で、バイナリ一式をRHELに転送します。面倒なのでプロジェクトまるごとSCPで転送しました。WindowsでSSHするのはBash on Ubuntu on Windowsを使いました。/mnt/<ドライブレター> 以下にWindowsのファイルシステムが見えます。
# scp -r WebApplication1 <user>@<server>:~/
あとはRHEL側に入ってdotnetコマンドで実行します。
$ dotnet WebApplication1/bin/Debug/netcoreapp1.1/WebApplication1.dll
VisualStudioに戻って、デバッグ>プロセスにアタッチを選びます。出てきた画面でRHELサーバーのホスト名を入力しEnterを押します。検索ボタンを押すのではないのに注意しないといけないのは今までと同じです。
するとこんな画面になるので、Password認証かPrivateKey認証を選んで接続します。その後プロセスの一覧が表示されるので、該当のプロセスを選択してアタッチします。
最後にコードの種類を聞かれるので、.NET Core on Unix を選びます。
これでリモートデバッグが開始されるので、あとはブレークポイントを置いたりできます。ちなみにunzipコマンドが入っていなかったりするとこの時点でエラーになってデバッグ出力の欄に表示されるので、確認しましょう。