設定 - リモートデバッグ
概要
Visual Studio 2012以降では、Windows-Windows間において、C#およびVB.NETをリモートデバッグすることができる。
また、Visual Studio 2017以降では、Windows-Linux間において、.NET CoreプロセスにSSH経由でアタッチできる。
ここでは、上記のデバッグの設定とデバッグ手順について記載する。
リモートマシンの設定
C++(Windows-Linux)
まず、Visual Studioからリモートデバッグができるように、リモートPC(Linux)に必要なライブラリをインストールする。
# RHEL sudo dnf install gcc make rsync gdb gdb-gdbserver unzip curl # SUSE sudo zypper install gcc make rsync gdb gdb-gdbserver unzip curl
Visual Studio 2019でリモートデバッグを行う場合は、以下のライブラリもインストールする。
# RHEL sudo dnf install ninja-build # SUSE sudo zypper install ninja-build
次に、SSHサーバの設定を行う。
SSHサーバは、RHELやSUSEを最小インストールした場合でもOpenSSHがインストールされるため、追加でインストールする必要はない。
また、初期設定では、パスワード認証方式でのログインが可能となっている。
したがって、最低限必要な設定として、セキュリティを考慮して、以下のようにrootアカウントの直接ログインの禁止設定を実施しておけばよい。
sudo vi /etc/ssh/sshd_config # /etc/ssh/sshd_configファイル PermitRootLogin no # 38行目
設定を反映させるため、sshdを再起動する。
sudo systemctl restart sshd
SSHの自動起動設定を行う。
sudo systemctl enable sshd
Firewalldを有効にしている場合は、SSHサービスの許可が必要である。
なお、SSHのポート番号は、22/TCPを使用する。
sudo firewall-cmd --add-service=ssh --permanent sudo firewall-cmd --reload
また、SFTPも有効にする必要がある。
多くのディストリビューションでは、既定でSFTPがインストールおよび有効化されている。
ただし、全てのディストリビューションでそうなるわけではないため、各自確認すること。
C#.NETでリモートデバッグを行う場合、リモートPC(Linux)に.NETランタイムをインストールする。(.NET SDKは不要)
.NETランタイムのインストールは、インストール - .NET SDKのページを参照すること。
C#またはVB.NET(Windows-Windows)
リモートマシン向けの設定を行う。
まず、以下に示すURLにアクセスして、Visual Studio向けのリモートツールをダウンロードおよびインストールする。
- Visual Studio 2022
- Visual Studio 2019
次に、リモートツールの設定を行う。
- リモートツールを起動する。
もし、リモートマシンに対する管理アクセス許可が無い場合は、リモートツールを[管理者として実行]を選択して起動する。
また、管理者として実行されているプロセスや別のユーザ(IIS等)で実行されているプロセスにアタッチする場合は、リモートツールを[管理者として実行]を選択して実行する。 - [リモート デバッグの構成]画面が表示される。(初めてリモートツールを起動する場合)
Windows Server 2008R2の場合、Windows Web Services API がインストールされていない場合は、[インストール]ボタンを押下する。 - リモートツールを使用するネットワークの種類を少なくとも1つ選択する。
- ドメインを介して接続されている場合、[ドメインネットワーク]にチェックを入力する。
- ワークグループまたはホームグループを介して接続されている場合、必要に応じて、[プライベートネットワーク]または[カジュアルネットワークまたは公衆ネットワーク]にチェックを入力する。
- [リモート デバッグの構成]画面にある[リモートデバッグの構成]ボタンを押下して、ファイアウォールを構成する。
ファイアウォールの構成が完了した後、リモートデバッガが起動して、[リモートデバッガー]画面が表示される。 - この時、リモートデバッガは接続を待機しているため、[リモートデバッガー]画面に表示されているサーバ名とポート番号を使用して、Visual Studioのリモート接続構成を設定する。
- リモートデバッガを停止するには、[リモートデバッガー]画面にある[ファイル]メニュー - [終了]を選択する。
リモートデバッガを再起動する場合は、[スタート]メニューから起動する、または、PowerShellまたはコマンドラインから以下のコマンドを実行する。<リモートツールのインストールディレクトリ>\msvsmon.exe
リモートマシンに、ビルドしたソフトウェアを配置するフォルダを作成する。
例えば、デスクトップ画面上に、RemoteProjectフォルダを作成する。
RemoteProjectフォルダを右クリックして、[プロパティ] - [共有]タブ - [詳細な共有]ボタンを押下する。
[詳細な共有]画面にある[このフォルダーを共有する]チェックボックスにチェックを入力して、[アクセス許可]ボタンを押下する。
[<フォルダ名>のアクセス許可]画面にある[フルコントロール]項目の[許可]チェックボックスにチェックを入力して、[OK]ボタンを押下する。
これにより、ホストPCから、ソフトウェアを配置するリモートマシンのフォルダにアクセス可能となる。
Visual Studioの設定
Visual Studioのセットアップ
- C++(Windows-Linux)
- Visual Studioインストーラを起動する。
[Visual Studioインストーラ]画面にある[変更]ボタンを押下して、[ワークロード]タブを選択する。 - [その他のツールセット]項目から、[C++によるLinux開発]ワークロードを選択する。
- もし、IoTまたは組み込みのプラットフォームをターゲットにしている場合は、画面右の[インストールの詳細]ウィンドウに移動して、
[C++によるLinux開発]の下で[オプションコンポーネント]を展開して、必要なコンポーネントを選択する。
[変更]ボタンを押下してインストールを行う。
- Visual Studioインストーラを起動する。
- C#(.NET Core)
- Visual Studioインストーラを起動する。
[Visual Studioインストーラ]画面にある[変更]ボタンを押下して、[ワークロード]タブを選択する。 - [ASP.NETとWeb開発]ワークロードまたは[.NET Coreクロスプラットフォーム開発]ワークロードのいずれかをインストールする。
- Visual Studioインストーラを起動する。
- C#またはVB.NET(Windows-Windows)
- 特になし。
プロジェクトの新規作成
- C++(Windows-Linux)
- [ファイル]メニュー - [新規作成] - [Visual C++] - [クロスプラットフォーム] - [Linux]を展開し、C++によるLinux開発を選択する。
- C#(.NET Core)
- [ファイル]メニュー - [新規作成] - [Visual C#] - [コンソールアプリケーション]または[クラスライブラリ]を選択する。
- もし、リリースビルドしたものをデバッグする必要がある場合、[ツール]メニューバー - [オプション] - [デバッグ]を選択して、[マイ コードのみを有効にする]をオフにする。
- C#(Windows-Windows)
- [ファイル]メニュー - [新規作成] - [Visual C#]からどのプロジェクトを選択してもよい。
プロジェクトの全般設定
- C++(Windows-Linux)
- [プロジェクト]メニュー - [プロパティ]を選択する。
(または、ソリューションエクスプローラーでプロジェクトを右クリックして、コンテキストメニューから[プロパティ]を選択する) - [プロジェクトのプロパティ]画面が表示されるので、画面左の[全般]を選択して、画面右の[構成の種類]プルダウンから、開発するファイルの種類を選択する。
- 既定では、実行可能ファイル(.out)が選択されている。
もし、スタティックライブラリまたはダイナミックライブラリの開発や既存のMakefileを使用する場合は変更する。
- [プロジェクト]メニュー - [プロパティ]を選択する。
リモート接続の設定
- C++(Windows-Linux)
- 接続先のLinuxを指定するダイアログ(Connect to Remote System)が表示されるので次のように入力する。
- Host Name : ホスト名またはIPアドレス
- Port : 22
- User Name : RHELまたはSUSEで使用しているユーザ名
- Password : RHELまたはSUSEで使用しているユーザ名のパスワード
- ※注意
- 次回からは、自動的にリモート接続される。
- リモート接続の再設定は、Visual Studioの[ツール]メニュー - [オプション] - [クロスプラットフォーム]からコネクションマネージャーで再設定できる。
- 接続先のLinuxを指定するダイアログ(Connect to Remote System)が表示されるので次のように入力する。
- C#(.NET Core)
- Visual Studioにおいて、[デバッグ] - [プロセスにアタッチ]を選択する。
- [接続の種類]プルダウンを[SSH]を選択して、[接続ターゲット]項目にリモート先PCのIPアドレスまたはホスト名を入力する。
- デバッグプロセスは、一意のプロセス名またはdotnetという名前のプロセスで実行される。
デバッグプロセスを探すには、[タイトル]列を確認する。この列には、デバッグプロセスのコマンドライン引数が表示される。
SSH経由のリモート先PCからのプロセスの一覧が、[プロセスにアタッチ]画面に表示される。 - デバッグプロセスにアタッチするには、[アタッチ]ボタンを押下する。
- 表示される画面において、デバッグするプログラムの種類を選択する。
例えば、WindowsとLinuxの間でデバッグする場合は、[マネージド(Unix用.NET Core)]等を選択する。 - Visual Studioのデバッグ機能を使用して、プログラムをデバッグする。
- C#またはVB.NET(Windows-Windows)
- プロジェクトのプロパティ画面左にある[ビルド] - [出力パス]項目において、リモートマシンに用意した共有ディレクトリのフルパスを入力する。
- プロジェクトのプロパティ画面左にある[ビルド] - [デバッグ]を選択する。
[開始オプション]項目 - [リモートコンピューターを使用する]チェックボックスにチェックを入力して、リモートマシンのIPアドレスまたはホスト名を入力する。 - Visual Studioのメイン画面から、[デバッグ]メニュー - [プロセスにアタッチ]を選択する。
- [接続先]欄に、
<リモートマシンのIPアドレスまたはホスト名>:<リモートデバッガのポート番号>
を入力して、[検索]ボタンを押下する。 - 接続に成功した場合、リモートマシンのユーザ名とパスワードを入力する。
- リモートマシンのプロセス一覧が表示されるので、デバッグを行うソフトウェアを選択して、[アタッチ]ボタンを押下する。
- アタッチに成功する時、通常デバッグを行う時と同様の画面に切り替わり、リモートデバッグが開始される。ブレークポイント等でステップが止まるかどうか等を確認する。
リモートデバッグの実行
- C++(Windows-Linux)
- 実行する前に、[デバッグ]メニューからLinux Consoleウインドウを表示する。
- リモートGDBデバッガを実行すると、実行結果がLinux Consoleウインドウに表示される。
- 実行する前に、[デバッグ]メニューからLinux Consoleウインドウを表示する。
- C#(.NET Core)
- Visual Studioにおいて、[デバッグ] - [プロセスにアタッチ]を選択する。
- [接続の種類]プルダウンを[SSH]を選択して、[接続ターゲット]項目にリモート先PCのIPアドレスまたはホスト名を入力する。
- デバッグプロセスは、一意のプロセス名またはdotnetという名前のプロセスで実行される。
デバッグプロセスを探すには、[タイトル]列を確認する。この列には、デバッグプロセスのコマンドライン引数が表示される。
SSH経由のリモート先PCからのプロセスの一覧が、[プロセスにアタッチ]画面に表示される。 - デバッグプロセスにアタッチするには、[アタッチ]ボタンを押下する。
- 表示される画面において、デバッグするプログラムの種類を選択する。
例えば、WindowsとLinuxの間でデバッグする場合は、[マネージド(Unix用.NET Core)]等を選択する。 - Visual Studioのデバッグ機能を使用して、プログラムをデバッグする。
- ソースコードにブレークポイントを貼り、Visual Studioのデバッガが停止するかどうかを確認する。
備考
- C++(Windows-Linux)
- Linuxのホームディレクトリ直下にprojectsディレクトリが自動的に作成および配置される。
- Linuxのホームディレクトリ直下にprojectsディレクトリが自動的に作成および配置される。
日本語を使う時の問題点
ソースファイル(Visual Studio側もLinux側も)がShift-JISで保存されるため文字化けが起きる。
外部エディタにてUTF-8で再保存して(Visual Studio側)、ビルドすると文字化けしない。