Mozilla rr という、実行のイベントを保存して、プロセスの実行を再現するデバッガを今更最近知りました。 ステップ実行を逆方向に行えるので、とても便利ですね。
仕組み的にはWSL2なら使えそうな気がしますが、WSL1の私は使えません。(ていうか、Windows 2004は一体いつなんだ…。)
仕方がないので、Hyper-V上のUbuntuで動かそうとしましたが、はい、動きません。チキショウ。
調べてみると、Wiki曰く 「Hyper-V does not seem to support PMU virtualization.」とのことで、 Hyper-V上では動かないのだ。
マジかよー、と一度は諦めたのですが、もう一度よく調べたら何かできたのでここにメモしておきます。
ちなみに、初めてUbuntu 20.04 も入れたので、そこからだぜ。
Ubuntu 20.04 のインストール
実は初めてのUbuntu 20.04。サクッと Hyper-V クイック作成から突っ込みます。
プロセッサやメモリや統合サービス等の設定を適当にして、起動。
サクッとインストールして、起動したのがこちら。
………リージョンを日本語にしていますが、全然翻訳されてない。
翻訳はされていませんが、ディレクトリは「デスクトップ」とかいう日本語になってるので、「Desktop」に変更。
最初からEnglishを選んだ方が楽だと思う。
LANG=C xdg-user-dirs-gtk-update
拡張セッション
このままじゃクリップボードの共有が出来なくて辛タンなので、Microsoft linux-vm-toolsでxrdpを入れて、拡張セッションを使えるようにします。
sudo apt install git mkdir ws cd ws git clone https://github.com/microsoft/linux-vm-tools.git cd linux-vm-tools/ubuntu
20.04が…………ない?あれー?
2020年7月現在だと、Ubuntu 20.04に対応していませんでした。
20.04対応のプリリクを出して下さっている方が居るので、そっちで試してみます。
(※未来の方で20.04があるなら、それを利用して下さい。)
git clone -b ubuntu20-04 https://github.com/Hinara/linux-vm-tools.git cd linux-vm-tools/ubuntu/20.04 chmod +x install.sh
で、 install.shを実行してreboot
sudo ./install.sh sudo reboot
rebootしたらもう一回 install.shを実行し、シャットダウンします。
cd ~/ws/linux-vm-tools/ubuntu/20.04 sudo ./install.sh sudo shutdown now
Windows上で管理者権限のPowerShellを起動し、以下を実行。 Ubuntu 20.04の所は自分の仮想マシン名に合わせてください。
Set-VM -VMName "Ubuntu 20.04" -EnhancedSessionTransportType HvSocket
これで、一応拡張セッションは使えるようになったんですが、何かやたらと反応するかしないかが不安定です。4回に一回ぐらいしか、拡張セッションが有効にならない。よくわからん。なーんか、「ゲスト サービス」を有効にしてるとダメな感じがする…(不明)
Mozilla rr を使えるようにする
Windows Server 2019 および Windows 10 バージョン1809以降のバージョンのみ可能です。IntelのCPU以外は知らない。Ryzen欲しい。
先ずは Windows上で PowerShellを管理者権限で起動して、以下を実行。Ubuntu 20.04の部分は仮想マシン名に合わせてください。
なお、たぶん、 PMUだけで十分だとは思われる。
Set-VMProcessor "Ubuntu 20.04" -Perfmon @("pmu", "lbr", "pebs")
そして、Ubuntu20.04を起動して、rr
をインストール
sudo apt install rr
で、以下の様な適当なCコードを作成して、デバッグビルドしてrrで記録を取ってみる。
初回は必ず /proc/sys/kernel/perf_event_paranoid が3だと怒られるので、1に変更しておきます。
図のメッセージのように、 /etc/sysctl.conf にkernel.perf_event_paranoid = 1 を書くかどうかはご自由に。(私は面倒くさいので設定しましたが、どういう影響が出るのか良く分からないので…。まぁ、どうせ仮想マシンだし)
gcc -g3 foo.c echo 1 | sudo tee /proc/sys/kernel/perf_event_paranoid rr record ./a.out rr replay
これで上の図のようにちゃんとHyper-V上のUbuntu20.04でMozilla rrが動きました!やったね!