Ruby debug gem チートシート - nyg1971/test GitHub Wiki

🚀 基本的な使い方

ブレークポイントの設置

# コード内にブレークポイントを設置
def some_method
  binding.break  # ← ここで実行が停止
  # 以降のコードは停止後に実行される
end

デバッガー起動(Docker環境)

# Rails サーバーをデバッグモードで起動
# またはshellから
bundle exec rails server -b 0.0.0.0 -p 3001

🔍 基本コマンド

変数・オブジェクト確認

(rdbg) p variable_name        # 変数の値を表示
(rdbg) p user                 # userオブジェクトの内容
(rdbg) p params               # paramsハッシュの内容
(rdbg) p user.email           # オブジェクトの属性
(rdbg) p user.class           # オブジェクトのクラス
(rdbg) pp object              # 整形して表示(pretty print)

実行制御

(rdbg) continue               # 実行を継続(c でも可)
(rdbg) c                      # continue の短縮形
(rdbg) step                   # 次の行に進む(メソッド内に入る)
(rdbg) s                      # step の短縮形
(rdbg) next                   # 次の行に進む(メソッド内に入らない)
(rdbg) n                      # next の短縮形
(rdbg) finish                 # 現在のメソッドから抜けるまで実行
(rdbg) quit                   # デバッガーを終了
(rdbg) q                      # quit の短縮形

コールスタック確認

(rdbg) bt                     # バックトレース(呼び出し履歴)
(rdbg) backtrace              # bt の詳細版
(rdbg) up                     # 呼び出し元に移動
(rdbg) down                   # 呼び出し先に移動

💡 実用的なデバッグパターン

API開発でよく使うパターン

# AuthController での例
def login
  user = User.find_by(email: params[:email])
  binding.break  # ← ここで停止
  
  # デバッガーで確認
  # (rdbg) p user
  # (rdbg) p params
  # (rdbg) p params[:email]
  # (rdbg) p user&.valid_password?(params[:password])
end

エラーハンドリングのデバッグ

rescue StandardError => exception
  binding.break  # ← エラー時に停止
  
  # デバッガーで確認
  # (rdbg) p exception
  # (rdbg) p exception.class
  # (rdbg) p exception.message
  # (rdbg) p exception.backtrace
end

データベースクエリのデバッグ

def index
  users = User.includes(:department)
  binding.break  # ← クエリ実行前に停止
  
  # デバッガーで確認
  # (rdbg) p users.to_sql           # 生成されるSQL
  # (rdbg) p users.count            # レコード数
  # (rdbg) p users.first            # 最初のレコード
end

🛠 高度な機能

条件付きブレークポイント

# 特定の条件でのみ停止
users.each do |user|
  binding.break if user.email.include?("test")  # test を含む場合のみ停止
end

式の評価

(rdbg) eval user.customers.count    # 任意のコードを実行
(rdbg) eval User.count              # クラスメソッドも実行可能
(rdbg) eval params.to_json          # JSONに変換

ローカル変数一覧

(rdbg) locals                       # 現在のスコープの変数一覧
(rdbg) instance_variables           # インスタンス変数一覧

活用例

Users API開発での使用例

class Api::V1::UsersController < BaseController
  def create
    binding.break  # ← パラメータ確認
    
    user = User.new(user_params)
    binding.break  # ← 作成前の状態確認
    
    if user.save
      binding.break  # ← 保存後の確認
      render json: { user: user }
    else
      binding.break  # ← エラー時の確認
      render json: { errors: user.errors }
    end
  end
end

# デバッガーでの確認例
# (rdbg) p user_params
# (rdbg) p user
# (rdbg) p user.valid?
# (rdbg) p user.errors.full_messages

認証のデバッグ

def authenticate_request
  token = request.headers['Authorization']&.split(' ')&.last
  binding.break  # ← トークン確認
  
  decoded = JsonWebToken.decode(token)
  binding.break  # ← デコード結果確認
  
  @current_user = User.find(decoded[:user_id])
  binding.break  # ← ユーザー確認
end

# デバッガーでの確認例
# (rdbg) p token
# (rdbg) p decoded
# (rdbg) p @current_user

効率的なデバッグのコツ

  1. 小刻みにブレークポイント設置: 問題箇所を絞り込む
  2. 変数の中身を必ず確認: 想定と実際の違いを把握
  3. エラー時は exception オブジェクトを詳しく調査
  4. SQL クエリも確認: パフォーマンス問題の発見
  5. デバッグ後はブレークポイントを削除: 本番デプロイ前に必ず