# 帳票設計書 6-デバッガ print/eval出力

## 概要

mrubyデバッガ(mrdb)のprintおよびevalコマンドによる式評価結果の出力に関する帳票設計書である。`$`番号付きで結果をstdoutに表示する。

### 本帳票の処理概要

本帳票は、mrubyデバッガ(mrdb)のインタラクティブセッション内で、ユーザーが指定した任意のRuby式を評価し、その結果を標準出力に表示する機能である。`dbgcmd_print`関数により実装され、評価結果には連番の`$`番号が付与される。

**業務上の目的・背景**：デバッグセッション中に変数の値を確認したり、任意のRuby式を評価して実行状態を検証するために必要な機能である。GDB等のデバッガにおけるprintコマンドに相当し、対話的なデバッグワークフローの中核を担う。

**帳票の利用シーン**：mrdbデバッガのプロンプトでprintまたはevalコマンドを実行した際に出力される。例: `(mrdb) print x + 1` や `(mrdb) eval obj.method`。

**主要な出力内容**：
1. 評価結果の連番（`$N = `形式）
2. 式の評価結果（inspect形式の文字列）

**帳票の出力タイミング**：デバッガプロンプトでprint/evalコマンドを入力した際に即時出力される。

**帳票の利用者**：mrubyアプリケーション開発者（デバッグ時）。

## 帳票種別

テキスト出力（stdoutへのデバッガコマンド結果）

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| - | mrdbデバッガ | `(mrdb) print <expr>` | printコマンド実行 |
| - | mrdbデバッガ | `(mrdb) eval <expr>` | evalコマンド実行 |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | テキスト（stdout） |
| 用紙サイズ | N/A |
| 向き | N/A |
| ファイル名 | N/A（標準出力） |
| 出力方法 | printf / fwrite（stdout） |
| 文字コード | UTF-8 / ASCII |

### PDF固有設定

N/A

### Excel固有設定

N/A

## 帳票レイアウト

### レイアウト概要

```
$1 = 評価結果1
$2 = 評価結果2
...
```

### ヘッダー部

N/A（デバッガプロンプト内での逐次出力）

### 明細部

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | 連番 | 評価結果の連番 | `mrdb->print_no` | `$%lu = ` | 可変 |
| 2 | 評価結果 | 式の評価結果文字列 | `mrb_debug_eval()` | inspect形式テキスト | 可変 |

### フッター部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | 改行 | 出力行の終端 | - | `\n` |

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| デバッガセッション | mrdbデバッガが動作中であること | Yes |
| 式パラメータ | print/evalコマンドの後に式が指定されていること（wcnt > 1） | Yes |

### ソート順

N/A（逐次出力）

### 改ページ条件

N/A

## データベース参照仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| mrdb_state (構造体) | デバッガ状態 | デバッガセッション |

### テーブル別参照項目詳細

#### mrdb_state

| 参照項目（フィールド名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| print_no | 評価結果連番 | 常時 | unsigned long, インクリメント |
| wcnt | コマンドワード数 | 常時 | パラメータ検証用 |
| words[] | コマンドワード配列 | 常時 | 式の構築に使用 |
| dbg | デバッグコンテキスト | 常時 | mrb_debug_evalに渡す |

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| 連番 | `mrdb->print_no++` | なし | オーバーフロー時は1にリセット |
| 式文字列 | words[1]〜words[wcnt-1]を空白で連結 | なし | - |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[print/evalコマンド入力] --> B{パラメータあり?}
    B -->|No| C[Parameter not specified. 出力]
    B -->|Yes| D[wordsから式文字列を構築]
    D --> E[mrb_debug_eval で式を評価]
    E --> F[printf で連番出力]
    F --> G[fwrite で評価結果出力]
    G --> H[print_noインクリメント]
    H --> I[DBGST_PROMPT返却]
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| パラメータなし | wcnt <= 1 | `Parameter not specified.` | 式を指定してコマンドを再実行 |
| 評価エラー | mrb_debug_eval内で例外発生 | mrb_debug_evalの戻り値による | 式の構文を確認 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1回のコマンドで1件の結果 |
| 目標出力時間 | ミリ秒単位 |
| 同時出力数上限 | 1 |

## セキュリティ考慮事項

- 任意のRuby式を評価できるため、デバッガセッションへのアクセス制御が必要
- 評価結果にメモリアドレスや内部状態が含まれる場合がある

## 備考

- evalコマンドはdbgcmd_printの単純なエイリアスである（52行目）
- print_noがオーバーフロー（0に戻る）した場合、1にリセットされる
- 式の評価はmrb_debug_eval関数で行われ、現在のデバッグコンテキストで実行される

---

## コードリーディングガイド

本帳票を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | mrdb.h | `mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h` | mrdb_state構造体: print_no, wcnt, words[], dbgフィールド |

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | cmdprint.c | `mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c` | `dbgcmd_print`（17-47行目）: printコマンドのメイン処理 |
| 2-2 | cmdprint.c | `mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c` | `dbgcmd_eval`（50-53行目）: evalコマンド（printのエイリアス） |

**主要処理フロー**:
1. **19-22行目**: パラメータ検証（wcnt <= 1でエラー）
2. **27-31行目**: words配列から式文字列を空白連結で構築
3. **33行目**: mrb_debug_eval()で式を評価
4. **36行目**: `$N = `形式で連番を出力
5. **37行目**: fwriteで評価結果文字列を出力
6. **38行目**: 改行出力

#### Step 3: 評価処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | apiprint.h | `mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h` | mrb_debug_eval関数の宣言 |

### プログラム呼び出し階層図

```
dbgcmd_print() [cmdprint.c:17]
    │
    ├─ mrb_str_new_cstr() ← 空文字列生成
    ├─ mrb_str_cat_cstr() ← 式文字列構築 (ループ)
    ├─ mrb_debug_eval() ← 式評価
    ├─ printf() ← "$N = " 連番出力
    ├─ fwrite() ← 評価結果出力
    └─ putc() ← 改行出力

dbgcmd_eval() [cmdprint.c:50]
    └─ dbgcmd_print() ← エイリアス
```

### データフロー図

```
[入力]                    [処理]                        [出力]

コマンドワード ──▶ 式文字列構築 ──▶ mrb_debug_eval() ──▶ stdout
(words[1..n])     (空白連結)        (式評価)              │
                                                        ├─ $N =
                                                        └─ 評価結果
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| cmdprint.c | `mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c` | ソース | print/eval/info_localコマンド実装 |
| mrdb.h | `mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h` | ヘッダー | mrdb_state構造体定義 |
| apiprint.h | `mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h` | ヘッダー | mrb_debug_eval関数宣言 |
