← 記事

WindowsでRubyをコンパイルし、GDBでデバッグする方法

Rubyは私のお気に入りのプログラミング言語です。この記事は、MRI/YARVとも呼ばれるCRubyの開発についてです。

Windows版のRubyでgemをrequireするのに、なぜ必要以上に時間がかかるのか、長い間疑問に思っていました。そこから、WindowsでRubyをコンパイルする方法、さらにはデバッグする方法まで学ぶことになりました。
ほかの人がもっと簡単にできるように、私のアドバイスをまとめます。

議論:requireにLinuxよりXX倍の時間がかかる

私が抱えていた問題

私の環境では、require ‘tz-data’に最大1秒かかっていました。プログラムを一度起動するだけなら、十分速いと言えます。
調べてみると、ruby-concurrentには大量のファイルが含まれていることがわかりました。Rubyのプロセスに対してProcess Monitorを実行すると、ファイル関連のイベントが大量に発生しており、中には重複しているものもありました。

通常、Ruby gemにはそれほど多くのファイルはありませんが、ruby-concurrentはいつもより多くのファイルを含んでいます。いずれにしても、残念ながらWindowsでのファイルの読み込みはLinuxより少し遅いのです。それでも、ここまで遅いのは妙に思えます。

セットアップ

https://github.com/MSP-Greg/ruby-loco/blob/main/Local-Use.mdを読んで、すべての手順を実行してください(ビルドスクリプトの名前は変わっています)。

ファイルを調整した私のフォークを使ってください。

最新のPowerShellをインストールします。

次のコマンドを実行します。

winget search Microsoft.PowerShell
winget install --id Microsoft.Powershell --source winget

ruby-locoリポジトリを開き、最新のPowerShell(7.2)で次のコマンドを実行します。

 .\1_0_build_install_msys2_64_debug.ps1

VS CodeのGDB Beyond拡張機能をインストールし、次の設定を追加します。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "by-gdb",
            "request": "launch",
            "name": "Launch(gdb)",
            "program": "ruby-ucrt/bin/ruby.exe",
            "programArgs": "test.rb",
           // "cwd": "${workspaceRoot}",
            "cwd": "${workspaceRoot}",
            "stopAtEntry": true,
            "debuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe"
        }
    ]
}

これでVS Codeでブレークポイントを設定し、デバッグを開始できます。デバッガーは最初に自動的に停止します。この動作はstopAtEntryで変更できます。

break FUNCTIONNAMEで、手動でブレークポイントを設定することもできます。

GDBとデバッグについてのメモ

Rubyはデバッグシンボル付きでコンパイルする必要があります。cflagsに-gを追加し、-sや-Sが含まれていないことを確認してください。また、O3フラグも問題になることがあります。

ruby-locoを使わずにRubyをビルドする方法

私はうまく動かせませんでしたが、ruby-locoを使わない場合はおおよそ次のようになります。

# you first have to install all the msys packages, see ruby-loco for a list of them.
# oneclick/rubyinstaller2-packages has the newer openssl version

./autogen.sh
mkdir build 
mkdir install
cd build
../configure --prefix=$PWD/../install --enable-shared
make miniruby -j
./miniruby -v
make gdb
make gdb-ruby
make install-nodoc -j

参考資料と関連リンク

Tips and tricks in MRI Ruby development

gdbを使ったrubyのデバッグ

perforce.com: gdb-stuck-ruby.txt

No Debugging symbols found when using gdb
MSYS2 MinGW GCC環境をつくる(その4

How to create Ruby C extension and debug in VS Code

Visual C++をインストールする

Ruby Hacking Guide

Ruby Installer2
Ruby Installer2のビルド済みpacman msysパッケージ