Visual Studioで、Windowsのプログラム(アプリ)をリモートからデバッグする方法を紹介します。
Visual StudioをインストールできないWindowsマシンに対してプログラムをデバッグするときに役に立ちます。
環境依存で、特定のマシンでしか発生しないことが多いんですよね。他のマシンで再現テストを実施しても再現できないときの最終手段です。
システムのDLLなどが更新され、他のアプリの動作に影響がある可能性があるからだよ。
Visual Studioのインストールや基本的な操作は以下の記事を参照ください。
このブログ記事の内容を実際に動作させて動画で説明しています。
VisualStudioのリモートデバッグとは
Visual Studioのリモートデバッグとは、別のWindowsマシンに配置されているVisual Studioで作成したプログラムをリモートからデバッグするための機能です。
リモートデバッグを行うには、デバッグ対象のWindowsマシンにリモートツールをインストールし、Visual Studioからリモートコンピューターに接続するようにプロジェクトを設定する必要があります。
リモートデバッグを利用すると、ローカルマシンにプログラムをインストールすることなく、ブレークポイントやステップ実行などのデバッグ機能を使用できます。
リモートデバッグは、C#、VisualBasic、C++などのさまざまな言語やプロジェクトタイプに対応しています。
TCP/IP接続を行うので、デバッガに使うポート番号にアクセス許可が必要です。
例えば、社内にある自分のWindowsマシンとサーバ室にあるWindowsマシンなど。
リモートデバッグの手順
最新のVisual Studio 2022 を使って説明しますが、VS2019やVS2017でも同じ流れです。
C++で作成したコンソールアプリケーションで動作確認しました。
0.【リモート】リモートデバッグツールのインストール
1. プログラムのビルド
2. プログラムのコピー
3.【リモート】リモートデバッガ実行
4.【リモート】プログラムの実行
5. VisualStudioで実行プログラムにアタッチしデバッグ
【リモート】と記載部分は、リモートのWindowsマシンでの作業です。
リモートデバッグツールのインストール
リモートマシンにリモートデバッグツール「Remote Tools for Visual Studio 」をインストールします。
「Remote Tools for Visual Studio」をダウンロードします。
https://learn.microsoft.com/ja-jp/visualstudio/debugger/remote-debugging?view=vs-2019
https://learn.microsoft.com/ja-jp/visualstudio/debugger/remote-debugging?view=vs-2022
リンクを押しても「Remote Tools」にジャンプしない場合は、「ダウンロード」を選択し、検索キーワードに「Remote Tools for Visual Studio」を入力すると Visual Studioのバージョンごとに表示されるので、利用中のVisualStudioを選択します。
管理者権限でインストールします。
ランタイムライブラリ(再頒布可能パッケージ)のインストール
プログラムに必要な Visual Studio の Microsoft Visual C++ 再頒布可能パッケージをインストールします。
Visual Studio の Microsoft Visual C++ 再頒布可能パッケージ
「Visual Studio 2022 の Microsoft Visual C++ 再頒布可能パッケージ」が必要なのでそれもダウンロードします。32bitか64bitを選択します、ここで選ぶのはデバッグしたいプログラムと同じものです。
ビルドしたプログラムが64bitの場合は64bit(x64)を使用します。
ビルドしたプログラムが32bitの場合は32bit(x86)を使用します。
リモートマシンに余計なランタイムライブラリを入れたくないので、C++やC言語で開発したプログラムは、後述するDLLをコピーする方式のほうがマシン環境を変えずに便利だと思います。
プログラムをリモートPCにコピー
ビルドしたプログラムを Debugフォルダごと丸ごとコピーします。プログラムをデバッグするために、拡張子が.exe以外のデバッグ情報が保存されているPDBファイルも必要になります。
PDBファイルは、アプリケーションのソースコードと実行コードを対応付けるために必要なファイルです。
リモートデバッガの実行
リモートPCでリモートデバッガの初期設定を行います。
リモートPCで「Remote Debugger Configuration Wizard」を起動します。
サービスとして実行する必要はないので、そのまま「次へ」を選択します。
ファイヤーウォールの設定で、上の2つで問題なし。
「Remote Debugger」を起動します。この画面が出れば待機状態になっています。
リモートデバッグツールのポート番号を確認
リモートデバッグツールが利用するTCP/IPのポート番号を確認します。
「ツール」-「オプション」で確認。4026でした。
リモートPCでデバッグするプログラムの実行
リモートPCでコピーしたプログラムを実行します。
今回は、ローカルからアタッチしやすいように入力待ちにしています。sleepを入れてもいいと思います。
Visual Studioでプロセスにアタッチ
Visual Studioでリモートで実行されているプログラムにアタッチします。
図の⑤の作業です。
ローカルPCでVisual Studio を起動し、「デバッグ」-「プロセスにアタッチ」をクリックします。
「接続先」に、[リモートPCのIPアドレス]:4026 と入力して「検索」ボタンを押し、デバッグ対象のプログラムを選択します。
ローカルPCでデバッグ
画像のようにVisual Studioにデバッガで実行中のソースが表示されます。通常のデバッガの使い方と同じです。
画面アプリのように入力を待っている場合は、リモートPC側でアプリの操作が必要です。
ランタイムライブラリが不足
ランタイムライブラリ(再頒布可能パッケージ)のインストールしても、デバッグ版でビルドした場合、デバッグ用のDLLが不足する場合があります。
ビルドしたときのローカルPCには、含まれているので、それをすべてDebugフォルダにコピーする方法もあります。
Windowsの実行可能ファイル(exe)は、カレントディレクトリに存在するファイルを読み込むので、この方法が使えます。
必要なファイルをローカルPCでVisual Studioで実行すると「出力」ウィンドウにファイル名が表示されます。
これをコピーすると動作します。
■テキスト部を抜き出すと以下になります。Windowsディレクトリにあります。
‘win-remote-debug.exe’:’C:\src\win-remote-debug\x64\Debug\win-remote-debug.exe’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\ntdll.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\kernel32.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\KernelBase.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\apphelp.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\msvcp140d.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\vcruntime140_1d.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\vcruntime140d.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\ucrtbased.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\kernel.appcore.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\msvcrt.dll’ が読み込まれました。
‘win-remote-debug.exe’:’C:\Windows\System32\rpcrt4.dll’ が読み込まれました。
C:\Program Files\Microsoft Visual Studio\ フォルダ以下を検索すると、以下のような場所にもデバッグ用のランタイムライブラリがあります。
私の環境では以下にありました。
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.32.31326\debug_nonredist\x64\Microsoft.VC143.DebugCRT
あとがき
今回は、簡単なプログラムが動作するところまでを紹介しました。
有用なノウハウなど発見したら、追記していく予定です。
最後に(Windows VPSを紹介)
最後にWindowsの開発者が知っているとお得なことを紹介します。
クラウド上のWindows Serverがリーズナブルな価格で即日利用可能なVPSサービスが存在します。動作検証などで1ヶ月だけの利用などの用途にも使えます。
物理サーバマシンを手配したことがある方は分かりますが。
物理サーバを用意する場合は、メーカーにサーバマシンの見積りを取って、手配をして搬入して設置し、Windowsをインストールしてネットワークなどを設定してやっと使えるようになります。(どんなに早くても週単位で時間がかかります)
「ConoHa」と「さくらVPS」では、契約アカウントの作成からWindows Serverが使えるまで、30分かかりません。
(他の会社のVPSは、次の営業日だったりと開始まで時間がかかります。)
ConoHa の VPSは時間課金をサポートしているので、2、3日だけ使うという用途でも利用可能です。(4時間だけという使い方もできます)
私は記事を書くための調査や動作確認にConoHaのVPSを使っています。ローカルのPCにいろいろソフトをインストールするとWindowsが不調になるので。
Windows VPSの使い方を動画で紹介しています。
VPSの払い出し(構築)を行い、アプリを動作させて使い勝手を検証しています。