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
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
Ruby Installer2
Pacchetti msys pacman precompilati di Ruby Installer2