はじめに
以下のような、ターミナルからの入力を伴うRubyプログラムがあるとします。
print 'input number 1:'
a = gets.to_i
print 'input number 2:'
b = gets.to_i
puts "answer = #{a + b}"
これをVS Codeの用デバッガ(VSCode rdbg Ruby Debugger)を使ってデバッグ実行する方法を説明します。
実行環境
以下の環境で動作確認しています。
- Ruby 3.2.2
- debug.gem 1.8.0
- VSCode rdbg Ruby Debugger v0.2.1
- VS Code
Version: 1.80.0 (Universal)
Commit: 660393deaaa6d1996740ff4880f1bad43768c814
Date: 2023-07-04T13:39:33.766Z
Electron: 22.3.14
ElectronBuildId: 21893604
Chromium: 108.0.5359.215
Node.js: 16.17.1
V8: 10.8.168.25-electron.0
OS: Darwin arm64 22.5.0
デフォルト状態で実行するとダメ🙅♂️
以下はデフォルトのlaunch.json
です。
{
// 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": "rdbg",
"name": "Debug current file with rdbg",
"request": "launch",
"script": "${file}",
"args": [],
"askParameters": true
},
{
"type": "rdbg",
"name": "Attach with rdbg",
"request": "attach"
}
]
}
最後の行にブレークポイントを付けます。
これでデバッグ実行すると、こうなります。
一見、画面下の> 2
で入力できているように見えますが、この入力値はgets
メソッドに渡らないため、何をやってもプログラムは2行目から先に進みません😣
useTerminalオプションを指定すればOK👌
そこで、launch.json
にuseTerminal
オプション("useTerminal": true
)を指定します。
{
// 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": "rdbg",
"name": "Debug current file with rdbg",
"request": "launch",
"script": "${file}",
"args": [],
"askParameters": true,
"useTerminal": true
},
{
"type": "rdbg",
"name": "Attach with rdbg",
"request": "attach"
}
]
}
この状態でデバッグ実行すると、TERMINALタブから値を入力することができます。
(以下は2と3を入力した例。5行目でプログラムが停止している点にも注目)
変数の中身を確かめたりしたい場合はDEBUG CONSOLEタブを使います。
参考文献
VSCode rdbg Ruby DebuggerのGitHubリポジトリに以下の説明がありました。
- useTerminal
- If the configuration is true, create a new terminal and then execute the debug command line there. It is a bit slower.
- Otherwise, all outputs to the STDIN/OUT are shown in the DEBUG CONSOLE.
- If you need to use STDIN, please set this option.
- default: false