← Articles

Comment compiler Ruby sous Windows et le déboguer avec GDB

Ruby, mon langage de programmation préféré ! Cet article porte sur le développement de CRuby, aussi appelé MRI/YARV.

Je me suis longtemps demandé pourquoi, avec Ruby sous Windows, le chargement des gems prenait plus de temps que nécessaire. C’est ce qui m’a amené à apprendre à compiler Ruby sous Windows, et même à le déboguer.
Je veux faciliter la tâche à d’autres, alors voici mes conseils.

Discussion : require est XX fois plus lent que sous Linux

Mon problème

require ‘tz-data’ prenait jusqu’à 1 seconde sur mon système. C’est assez rapide si le programme ne démarre qu’une fois.
Après quelques recherches, j’ai découvert que ruby-concurrent comptait beaucoup de fichiers. J’ai lancé Process Monitor sur le processus Ruby et constaté de nombreux événements liés aux fichiers, certains même en double.

D’habitude, les gems Ruby n’ont pas autant de fichiers, mais ruby-concurrent en a plus que la moyenne. Le chargement de fichiers sous Windows est de toute façon un peu plus lent que sous Linux. Il semble pourtant étrange qu’il le soit autant.

Mise en place

Lisez https://github.com/MSP-Greg/ruby-loco/blob/main/Local-Use.md et suivez toutes les étapes. (Le script de compilation a été renommé.)

Utilisez mon fork avec les fichiers adaptés.

Installez la dernière version de PowerShell

Exécutez

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

Ouvrez le dépôt ruby-loco et exécutez ceci dans la dernière version de PowerShell (7.2)

 .\1_0_build_install_msys2_64_debug.ps1

Installez l’extension VS Code GDB Beyond et ajoutez la configuration suivante :

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

Vous pouvez maintenant poser des points d’arrêt dans VS Code et lancer le débogage. Le débogueur s’arrête automatiquement au début ; on peut changer cela avec stopAtEntry.

Vous pouvez aussi poser des points d’arrêt manuellement avec break FUNCTIONNAME.

Remarques sur GDB et le débogage

Il faut compiler Ruby avec les symboles de débogage : ajoutez -g aux cflags et assurez-vous qu’il n’y a ni -s ni -S. Le flag O3 peut aussi poser problème.

Compiler Ruby sans assistance

Je n’y suis pas vraiment parvenu, mais sans ruby-loco cela fonctionne à peu près ainsi :

# 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

Pour aller plus loin et références

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
Paquets pacman msys précompilés de Ruby Installer2