VS Codeでターミナルからの入力を伴うRubyプログラムをデバッグ実行する方法

## はじめに
以下のような、ターミナルからの入力を伴うRubyプログラムがあるとします。

```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](https://github.com/ruby/debug) 1.8.0
- [VSCode rdbg Ruby Debugger](https://marketplace.visualstudio.com/items?itemName=KoichiSasada.vscode-rdbg) 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`です。

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

最後の行にブレークポイントを付けます。

![Screenshot 2023-07-08 at 20.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/3706bc51-9741-66c1-f4fe-85c4eeac4907.png)

これでデバッグ実行すると、こうなります。

![Screenshot 2023-07-08 at 20.46.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/6b4b04d4-2c8a-84ca-e0ca-674e4e7910e9.png)

一見、画面下の`> 2`で入力できているように見えますが、この入力値は`gets`メソッドに渡らないため、何をやってもプログラムは2行目から先に進みません😣

## useTerminalオプションを指定すればOK👌

そこで、`launch.json`に`useTerminal`オプション（`"useTerminal": true`）を指定します。

```javascript 
{
  // 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行目でプログラムが停止している点にも注目）

![Screenshot 2023-07-08 at 20.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/72d9af06-a5c4-3527-7cc9-c10c4dc617a0.png)

変数の中身を確かめたりしたい場合はDEBUG CONSOLEタブを使います。

![Screenshot 2023-07-08 at 20.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/cc43e3cd-cb69-a350-6bf2-19382a7a8860.png)

## 参考文献

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
```

https://github.com/ruby/vscode-rdbg