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


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を確認することが出来ると思います。

動かない場合もあったり、微妙にグレーな気もしたりしますが、
デバッグスキルはとても大事なので頑張りたいですね!