Edited at

CALを消費せずにリモートデバッグを利用する

More than 1 year has passed since last update.

Windowsの開発者ですと、複数人で開発しているときにWindows端末にリモート接続して開発を行う場面もあるかと思います。

でも、リモートデスクトップには接続数の制限がありますよね。

Windows10だと1人しかアクセスできませんし、Windows Serverだとクライアントアクセスライセンス(CAL)が必要になります。

でも、デバッグするのにCALを使うとかちょっと本末転倒な感じもしますよね。

リモートデバッガを仕込んで動かせば、開発端末からサーバー端末に接続してデバッグなんかも可能ですが、

RDP接続してリモートデバッガ仕込んでも、CALを消費することには変わりありません。

そこで思い立ったのが以下の方法です。

PowerShell でEnter-PSSessionしてリモートデバッガを動かす

まあ、それだけなんですけど、やってる人を知らないのでご紹介します。


リモート接続の設定方法

設定は、 PowerShellで遠隔操作の準備 - Qiita を見ていただけたらわかるのではないでしょうか。

接続先で Enable-PSRemoting する感じ。

で、接続する方は

PS > Enter-PSSession コンピュータ名 -Credential アカウント

します。


リモートデバッガの仕込み方

接続できたら、リモートデバッガを起動します。

[コンピュータ名]: PS > & '<Visual Studio のインストール ディレクトリ>\Common7\IDE\Remote Debugger\(x64、x86、Appx)\msvsmon.exe' /nofirewallwarn

です。

コマンド自体はリモート デバッグ - MSDN - Microsoft から引用しただけですが、ポイントは

/nofirewallwarn

です。

環境によってオプションは変わるかと思います。

一度リモートデスクトップ上でリモートデバッガを起動させればわかりますが、

いろいろと確認ダイアログが表示されます。

ダイアログが表示されてしまうとリモートデバッガが開始されません

ここを探るのが難しいところですね。

で、別のPowerShellでEnter-PSSessionして

[コンピュータ名]: PS > Get-Process

すると、

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   SI ProcessName

------- ------ ----- ----- ----- ------ -- -- -----------
(略)
112 9 1616 5296 40 0.03 3760 0 msvsmon
117 10 1532 4936 40 0.02 4600 0 msvsmon
146 13 2988 9816 86 0.06 6600 0 msvsmon

と、Session IDが0でリモートデバッガが起動されます。便利!

リモート接続してデバッガを起動するとSession IDは1とか2とか3とかになるはずです。

あ、ちなみにPowerShellのバージョンが古いとSIが表示されないと思います。

その場合は、

[コンピュータ名]: PS > Get-Process | Where-Object -FilterScript {$_.SessionId -eq 0}

とかやれば、Session ID 0のものだけを表示できるので、msvsmonを確認することが出来ると思います。

動かない場合もあったり、微妙にグレーな気もしたりしますが、

デバッグスキルはとても大事なので頑張りたいですね!