Pry Debuggerを使用したRailsのデバッグ
シリーズのパート3Railsのデバッグに関する包括的なガイド
Rails Pryを使用したデバッグ
デバッグセッションがまだわからない場合は、実行パス内の選択したポイントでRailsコンソールを開くと考えてください。以下では、Pry-debuggerとpry-stack_explorer gemをインストールしていると仮定します。
ソースコードの任意の時点(gemfileに含まれているgemのダウンロードされたコード内を含み、bundle open gem_nameでテキストエディタで便利に開く)で、行バインディングを挿入詮索して Rubyインタプリタがその行を実行するたびに、その行の実行を停止し、その時点でPry REPLセッションを開きます。 ブラウザを介してwebサイトと対話していた場合は、Railsサーバーが実行されていたterminal consoleタブにプログラムを切り替えて、Pryセッションを表示する必要があ
何を説明するのかを明確にするために、ここにコードスニペットを含めます。
def place_everyone_on_sale Seller.all.each do |seller| place_on_sale(seller) endenddef place_on_sale(seller) binding.pry # Execution will stop here. new_products = generate_products(seller) new_product.advertise new_productsenddef generate_products(seller) seller.documents.each do |document| document.place_online if document.releasable endend
Pryコンソール内には、状態を検査したり、ls製品などでプログラムをイントロスペクトするために既に言及されているすべての機能があります。 デバッグでは、スタックフレーム間でスタックナビゲーションが追加されます。 少し嘘をついて、スタックフレームを”スタックトレースに沿った可能なポイントのいずれかで開かれたREPLコンソールとして定義しましょう。 さらに、より具体的な原因を探して、私たちのエラーを特定します。 特定の変数が値を変更する瞬間を探すことによって、これを行うことがあります(たとえば、cookieが設定されます)。 他の時には、実行の流れを観察し、期待するものと見るものを比較します。 たとえば、if-else構造の間違った分岐が実行されたことに気付くかもしれません。
上記のコードスニペットでplace_everything_on_sale
を実行すると、place_on_sale
メソッド内でPryセッションに入り、次に何をしたいのかという質問が表示されます。
-
stepコマンドは、次の行のメソッドに移動し、スタックフレームをそのメソッド内に変更することで実行を続行します。 それはより深く行く別の方法を言い表した。 コード例に従って、
step
を実行すると、generate_products
メソッド内に移動し、その時点で次に何をしたいかを尋ねられます。 -
上記の
step
を使用してgenerate_products
メソッドに”ステップ”しましたが、デバッガがすべての行の後にナビゲーションコマンドの選択を要求せずにgenerated_products
メソッドの最後にス 現在のスタックフレームがすべての行を実行し、閉じて値を返すまで実行するには、finish
と入力して、以前にステップアウトしたスタックフレームに戻って この例に従えば、place_on_sale
メソッドに戻り、インタプリタがgenerated_products
を評価した後のポイントに戻ります。 -
次のコマンドは、現在の行を実行し、現在のコンテキスト内の次の行またはメソッドに移動します。 別の言い方をすれば、より深く行くことなく、現在の方法の下に一つの行を続けます。 コード例を見ると(そして、プログラムを再起動して
place_everything_on_sale
を実行し、Pryセッションを新しく開いたふりをして)、next
と入力すると、内部に落とさずにgenerate_productsを完全に実 次のステップはステップよりも大きく、またはRailsの用語では次のhas_manyステップです。 Generate_productsメソッド内のすべてのコード(そうでなければ多くのステップになります)は、next
コマンドを一度に使用することで締結されています。 あなたの次のナビゲーションの決定は、ステップするかどうか、次はnew_product.advertise
になります。 -
Pryセッションを中止し、
continue
コマンドを使用して通常どおりプログラムの実行を続行します。 インタプリタが別のバインディングに遭遇した場合。pryステートメント(上記のplace_everyone_on_sale
メソッドを呼び出すと発生します)は、売り手ごとにplace_on_saleメソッドを一度実行するため、反復ごとにPryセッションを開きます。 プログラムが停止し、毎回デバッガをナビゲートする必要があるため、exit-program
と入力して後続のバインディングの効果をキャンセルすることができます。あなたのRailsプログラムを終了することなく、文を詮索する。 -
現在のメソッドのソースコードを表示する:
whereami
あなたが正しいクラスにいることを確認したり、デバッグセッションで数フレームを移動した後に終了した場 -
Print and navigate call stack Rubyで例外が発生すると、その例外の前に呼び出されたすべてのメソッドのスタックトレースが出力されます。 例外が発生していないにもかかわらず、これまでのスタックトレースを表示したい場合があります。
pry-stack_explorer
gemを追加することによってインストールされた特定のpry拡張機能のおかげで、show-stack -v
でこれを行うことができます。 このコマンドは、現在のフレームを矢印で示すスタックトレースを出力します。 Upまたは”up{n}”を使用して別のフレームに移動することができます。up3は、現在配置されているメソッドを最終的に呼び出したメソッド(など…)を呼び出 スタック内のどこに移動したかを確認するにはshow-stack
と入力し、反対方向にフレームを移動するには下に入力します。 -
値を使用してコンテキストを終了します: 時には、Pryセッションから特定の値を返すことによってプログラムフローを操作したい場合があります。 緊張した例では、
first_name = binding.pry
を読むコード行があるとします。 First_name変数にはPryセッションからの出力が割り当てられ、exit "jack"
でこの値をjackに設定できます。
場合によっては、バインディングを正確に指定したい場合があります。pryはpryセッションを開きます。 私はRubyコード条件文でこれを行います:
binding.pry if session == true binding.pry if @first_name == "Jack" binding.pry if iteration > 4
シリーズのパート3Railsのデバッグに関する包括的なガイド Rails Pryを使用したデバッグ デバッグセッションがまだわからない場合は、実行パス内の選択したポイントでRailsコンソールを開くと考えてください。以下…
シリーズのパート3Railsのデバッグに関する包括的なガイド Rails Pryを使用したデバッグ デバッグセッションがまだわからない場合は、実行パス内の選択したポイントでRailsコンソールを開くと考えてください。以下…