← Articoli

Come compilare Ruby su Windows e fare il debug con GDB

Ruby, il mio linguaggio di programmazione preferito! Questo articolo parla dello sviluppo di CRuby, noto anche come MRI/YARV

Per molto tempo mi sono chiesto perché con Ruby per Windows il require delle gem richiedesse più tempo del dovuto. Questo mi ha portato a imparare a compilare Ruby su Windows e persino a farne il debug.
Voglio rendere la cosa più semplice per altri, quindi ecco i miei consigli.

Discussione: require impiega XX volte più tempo che su Linux

Il mio problema

require ‘tz-data’ impiegava fino a 1 secondo sul mio sistema. Il che è abbastanza veloce se il programma si avvia una sola volta.
Dopo alcune ricerche ho scoperto che ruby-concurrent aveva molti file. Ho eseguito Process Monitor sul processo Ruby e ho visto che c’erano molti eventi legati ai file, alcuni addirittura doppi.

Di solito le gem Ruby non hanno così tanti file, ma ruby-concurrent ne ha più del normale. Caricare file su Windows è purtroppo comunque un po’ più lento che su Linux. Eppure sembra strano che lo sia così tanto.

Configurazione

Read https://github.com/MSP-Greg/ruby-loco/blob/main/Local-Use.md e seguite tutti i passaggi. (Lo script di build è stato rinominato)

Usate il mio fork con i file adattati.

Installate la PowerShell più recente

eseguite

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

Aprite il repository ruby-loco ed eseguite questo nella PowerShell più recente (7.2)

 .\1_0_build_install_msys2_64_debug.ps1

Installate l’estensione GDB Beyond per VS Code e aggiungete la seguente configurazione:

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

Ora potete impostare breakpoint in VS Code e avviare il debug. Il debugger si ferma automaticamente all’inizio. Potete cambiare questo comportamento con stopAtEntry.

Potete anche impostare breakpoint manualmente con break FUNCTIONNAME.

Note su GDB e sul debug:

Dovete compilare Ruby con i simboli di debug: occorre aggiungere -g ai cflags e assicurarsi che non ci siano -s o -S. Anche il flag O3 potrebbe causare problemi.

Compilare Ruby senza aiuti:

Non sono riuscito a farlo funzionare del tutto, ma senza ruby-loco funziona più o meno così:

# 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

Approfondimenti e riferimenti

Consigli e trucchi per lo sviluppo di MRI Ruby

gdbを使ったrubyのデバッグ

perforce.com: gdb-stuck-ruby.txt

Nessun simbolo di debug trovato usando gdb
MSYS2 MinGW GCC環境をつくる(その4

Come creare un’estensione C per Ruby e farne il debug in VS Code

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

Ruby Hacking Guide

Ruby Installer2
Pacchetti msys pacman precompilati di Ruby Installer2