← Blog

Ruby unter Windows kompilieren und mit GDB debuggen

Ruby, meine liebste Programmiersprache! In diesem Beitrag geht es um die Entwicklung von CRuby, auch bekannt als MRI/YARV.

Lange fragte ich mich, warum das Laden von Gems mit require unter Ruby für Windows länger dauert, als es sollte. Das führte dazu, dass ich lernte, Ruby unter Windows zu kompilieren und sogar zu debuggen.
Ich möchte es anderen leichter machen, deshalb hier meine Tipps.

Diskussion: require dauert XX-mal länger als unter Linux

Mein Problem

require ‘tz-data’ dauerte auf meinem System bis zu 1 Sekunde. Das ist schnell genug, wenn das Programm nur einmal startet.
Bei meinen Nachforschungen fand ich heraus, dass ruby-concurrent sehr viele Dateien hat. Ich liess den Process Monitor auf den Ruby-Prozess laufen und sah viele dateibezogene Ereignisse, manche sogar doppelt.

Normalerweise haben Ruby-Gems nicht so viele Dateien, aber ruby-concurrent hat mehr als üblich. Das Laden von Dateien ist unter Windows leider ohnehin etwas langsamer als unter Linux. Und doch scheint es seltsam, dass es so viel langsamer ist.

Einrichtung

Lesen Sie https://github.com/MSP-Greg/ruby-loco/blob/main/Local-Use.md und führen Sie alle Schritte aus. (Das Build-Skript wurde umbenannt.)

Verwenden Sie meinen Fork mit den angepassten Dateien.

Installieren Sie die neueste PowerShell

Führen Sie aus:

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

Öffnen Sie das Repository ruby-loco und führen Sie dies in der neuesten PowerShell (7.2) aus:

 .\1_0_build_install_msys2_64_debug.ps1

Installieren Sie die VS-Code-Erweiterung GDB Beyond und fügen Sie folgende Konfiguration hinzu:

{
    // 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"
        }
    ]
}

Jetzt können Sie in VS Code Breakpoints setzen und das Debugging starten. Der Debugger hält automatisch am Anfang an. Das können Sie mit stopAtEntry ändern.

Breakpoints lassen sich auch manuell mit break FUNCTIONNAME setzen.

Hinweise zu GDB und zum Debugging:

Sie müssen Ruby mit Debug-Symbolen kompilieren: -g zu den cflags hinzufügen und sicherstellen, dass dort kein -s oder -S steht. Auch O3 als Flag kann ein Problem sein.

Ruby ohne Hilfsmittel bauen:

Richtig zum Laufen gebracht habe ich es nicht, aber ohne ruby-loco funktioniert es ungefähr so:

# 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: vorkompilierte pacman-Pakete für MSYS