LEFログ:学習記録ノート

leflog: 学習の記録をどんどんアップしていきます

【Windows&WSL2】VSCodeのデバッグでエラーが出たときの解決方法(Ruby Debuggerの拡張機能など)

ご挨拶

地球の皆さん、おはこんばんちは! 青い地球に住む青いゾウのLEFと申します。🐘

VSCodeを使っていて、自分が遭遇したとあるエラーの解決法について説明致します。

※今回はRuby Debuggerでエラーが出たときの解決法を書いていますが、他のデバッグ拡張機能でエラーが出たときも、同じような方法で解決できると思います。

概要

自分は開発環境をWSL2で整えていて、統合開発環境を使いたいときにはVSCodeを使っているのですが、今回VSCodeで原因不明の事象が発生しました。

具体的には、VSCodeデバッグしようとしたとき(「実行とデバッグ」ボタンを押したとき)に表示される、このエラーについてです。

Error: exit code is 1
Make sure to install rdbg command (`gem install debug`).
If you are using bundler, write `gem 'debug'` in your Gemfile.

エラー文の通りに、gem install debugを実行したのですが、どうやっても解決しませんでした。

自分はWSL2に開発環境を用意しているので、WSL2(Linux)とWindowsの両方でコマンドを実行し、PATHも確認したのですが、なぜかエラーが直りませんでした。

WSL2のターミナル(zshbash)や、Windowsのターミナル(PowerShellコマンドプロンプト)から、コマンドでrdbgと打てば、ターミナル上では普通に起動します。
つまり、VSCode拡張機能のデバッガーだけに、何かしらの問題が発生しているようです。

結論

結論から言いますと、このエラーを解決するためには、2つの操作が必要です。

  1. WSL2に追加のgemを入れる

  2. Remote WSLを起動し、そちらの画面でデバッグを開始する

解説と手順

順を追って説明致します。

VSCodeには、デバッグを開始するための機能が、初めから備わっています。
更に、CodeRunnerという、簡単にコードを実行できる拡張機能が標準で装備されています。

それとは別に、VSCode上では、好きなターミナルを表示させることができます。
PowerShellでもコマンドプロンプトでもGitBashでもWSL2(Debian)でもWSL2(Ubuntu)でも、好きなターミナルを表示させて、それを実行することができます。
そのため、PowerShellでは動かないものであっても、WSL2(Debian)を使って、VSCode上でコードを実行できるというわけです。

しかし、ここに勘違いしやすい落とし穴があります。

それは、VSCodeの「デバッグを実行」は、ターミナルとは関係なく、起動しているOS上でおこなわれるということです。

つまり、VSCodeでWSL2のターミナルを表示させ、そこで色々コマンドを実行できるようにしていても、デバッグを実行したりCodeRunをおこなってCodeRunnerを起動させると、強制的にWindows側のほうでコードが実行されるのです。

この基本的な仕様を、自分は今まで理解していませんでした。

そのため、VSCodeそのものがコードを動かすときに、もっと緊密な形でWSL2と接続する必要があります。
つまり、VSCodeそのものを、WSL2上で動かす必要があります。

そのためには、Remote - WSLという拡張機能を入れる必要があります。

そして、ここが自分が勘違いした大事なポイントなのですが、Remote - WSLを入れているだけでは、Remoteへ接続されないということです。

この拡張機能を入れるだけではなく、この拡張機能を実行し、新しいVSCodeを開いた上で、そこで自分が使いたいディレクトリ(フォルダ)を開く必要があります。

(拡張機能を入れていれば、自動的にWSL2へと接続されるものだと自分は思い込んでいました)

このとき、ディレクトリをドラッグして開こうとすると、Windows側のVSCodeで開いちゃうことがあります。そのため、/を使って、直接フォルダの場所をタイプする必要があります。

Remote - WSLに切り替わっているかどうかは、左下に表示されています。

VSCodeの左下の画像です。緑色の表示が「WSL: Ubuntu」や「WSL: Debian」などへ切り替わっていることを必ず確認しましょう。

そして、Remote - WSLの側では設定や拡張機能が初期状態のままなので、必要に応じて拡張機能をインストールすることも必要です。
というのも、WSL2の上では、拡張機能はまだインストールされていないからです。

繰り返しになりますが、Remote - WSLとは、WSL2上でVSCodeを起動(展開)させることです。
つまり、Windows上でVSCodeを起動させるのとは、本質的にまったく異なるというわけです。

普通にVSCodeを展開させるだけだと、WSL2のターミナルは開けますが、Windowsで起動しているため、対象のPATHが見つからず、エラーが出てしまったというわけです。

Windows側の設定をたくさんいじれば、Windows側で起動したままエラーが解決するのかもしれませんが、かなり複雑そうであり、自分では解決しそうになかったので、今回は取り上げません。
→もし、Windows側で起動したままエラーを解決する方法があれば、ぜひコメント欄などで教えていただけると嬉しいです!

と、いうわけで、Remote - WSLを起動する必要があるのですが、もうひとつだけおこなうことがあります。

それは、追加のgemをWSL2へと入れることです。
(WSL2のほうにインストールします)

公式で指示されている、gem install debugのほかにも、入れておいたほうが良いgemがあります。

具体的には

$ gem install ruby-debug-ide
$ gem install debase

をして、追加のgemを入れておく必要があります。

自分はこの追加gemを入れる前にデバッグを実行してみたら、エラーが出たままでした。
とりあえず入れてみるのが良さそうです。

ついでに、gemもアップデートしておくと安心かもしれません。

$ gem update --system
$ gem update

そして最後は、デバッグをしたい行の左に赤ポチををつけて、そして「デバッグを実行」を押せば、無事、エラーが出ずにデバッグを開始することができます。

まとめ

自分がRemote -WSLの挙動を正しく理解していないのが主な原因でした。
VSCodeの仕組みは意外と難しく、単なるエディタではなく、あくまでIDEだということを気に留める必要があります。

基本的に、WSL2で開発環境を整えているならば、毎回このRemoteのほうでVSCodeを起動したほうが良さそうです。

また、改めて質問することの重要性を理解しました。

もし、今回のエラーを「ターミナルでは普通に動くし、解決しなくてもいいや! 放置放置~♪」って投げ出していたら、このようなVSCodeの仕組みを理解しないまま突き進んでしまい、もっと大きなエラーにぶつかったときに、途方に暮れてしまっていたでしょう。
今の段階の、まだ本格的にコードを書き始める前に、理解することができたのは僥倖でした。

感謝とお礼

このエラーは、フィヨルドブートキャンプのkomagataさんと yocajiiさんに、質問雑談タイムで助けていただきました。ありがとうございました!🙏

もし、自分一人でこのエラーに遭遇していたら、諦めてしまっていたと思います。😅

また、WindowsではなくMacですが、同じエラーに関して、jnchitoさんがフィヨルドブートキャンプ内のQ&Aで他の方に回答されていました。その情報もとても参考になりました。✨

参考URL

VScodeでWSL上のRuby on Railsコードを書く