回答:
インストール:
$ gem install pry
$ pry
それから加えて:
require 'pry'; binding.pry
あなたのプログラムに。
以下のようpry
0.12.2しかし、など全くナビゲーションコマンドが存在しないnext
、break
など、いくつかの他の宝石は、さらに、例えば参照、これを提供しますpry-byedebug
。
binding.pry
です。また..動的編集にカラー完了、ドキュメントの検索、および可能性が付属していますし、方法をリロード
Pry
/ byebug
は素晴らしいですが、デバッグ時の最初のステップではありません。ほとんどの場合、例外を発生raise object.inspect
させると、IRBセッションを開くよりも早く問題が解決されます。例外を発生させるなどの簡単な解決策では問題を解決できない場合は、コンソールデバッガーのみを使用することをお勧めします。
pry
ますか?私はそれを行う方法を見つけることができませんでした。そしてそれは私がデバッガーに期待することです。
Rubyの場合:
ruby -rdebug myscript.rb
その後、
b <line>
:ブレークポイントを置く n(ext)
またはs(tep)
andc(ontinue)
p(uts)
ディスプレイ用(perl debugと同様)
Rails:サーバーを起動
script/server --debugger
debugger
コードを追加します。
-r debug
がゴミだと言うのですか?
facets
、gem要件にある特定のバージョンのRails 2.2アプリで実行するPryの古いバージョンを見つけようとしましたが、失敗しました。古代のRailsアプリでruby-debug
は少し厄介ですが、仕事は完了です。
手すりがお勧めです:こじ開けてください!私はこれに同意することしかできません。
pryはirbよりはるかに優れたreplです。
追加する必要があります
require 'pry'
ソースファイルに追加して、ソースコードにブレークポイントを挿入します
binding.pry
物事を確認したい場所(これは、クラシックIDE環境でブレークポイントをトリガーするようなものです)
プログラムがヒットしたら
binding.pry
行を開くと、プログラムのすべてのコンテキストが手元にあるため、pry replに直接投入されるので、すべてを探索し、すべてのオブジェクトを調査し、状態を変更し、その場でコードを変更することさえできます。
あなたが現在いるメソッドのコードを変更することはできないので、実行する次の行を変更できないのは残念です。しかし、良いルビコードはとにかく単一行になる傾向があります;-)
例外を発生させることによるデバッグは、ログステートメントを細かく調べるよりもはるかに簡単ですprint
。また、ほとんどのバグでは、通常、またはのようなirbデバッガーを開くよりもはるかに高速です。これらのツールは、常に最初のステップではありません。pry
byebug
Exception
thenと.inspect
その結果を発生させる最速(特にRailsの)コードをRubyのをデバッグする方法があるにraise
呼び出し中にあなたのコードの実行パスに沿って例外.inspect
メソッドまたはオブジェクト(例えば上foo
):
raise foo.inspect
上記のコードでは、をraise
トリガーしException
てコードの実行を停止し、デバッグしようとしている行.inspect
のオブジェクト/メソッド(つまりfoo
)に関する情報を含むエラーメッセージを返します。
この手法は、オブジェクトやメソッドをすばやく調べたり(たとえばnil
?)したり、特定のコンテキスト内でコード行がまったく実行されていないかどうかを即座に確認したりするのに役立ちます。
byebug
やpry
コード実行フローの状態に関する情報を取得した後でのみ、Ruby gem irbデバッガーなどに移動することを検討するpry
かbyebug
、実行パス内のオブジェクトの状態をより深く掘り下げることができます。
問題をデバッグしようとするときは、常に次のことをお勧めします。 !@#$ ingエラーメッセージ(RTFM)を読む
エラーメッセージを読んだことを意味し、慎重かつ完全にあなたがなるように処理する前に、あなたを教えしようとしているものを理解しています。 デバッグするときは、エラーメッセージを読むときに、次の精神的な質問をこの順序で行ってください。
nil
ですか?) スタックトレースでは、プロジェクトからのコード行(たとえばapp/...
、Railsを使用している場合はで始まる行)に特に注意してください。問題の99%はあなた自身のコードにあります。
この順序で解釈することが重要である理由を説明するには...
ある時点でそのように実行するコードを実行します。
@foo = Foo.new
...
@foo.bar
そしてあなたは次のようなエラーを受け取ります:
undefined method "bar" for Nil:nilClass
初心者はこのエラーを見て、問題はメソッドbar
が未定義であることだと思います。そうではありません。このエラーで重要な実際の部分は次のとおりです。
for Nil:nilClass
for Nil:nilClass
つまり、それ@foo
はニルです! インスタンス変数で@foo
はありませんFoo
!あなたはであるオブジェクトを持っていますNil
。このエラーが表示さbar
れた場合は、クラスのオブジェクトに対してメソッドが存在しないことをrubyが伝えようとしているだけですNil
。(まあまあ!クラスでFoo
はなくオブジェクトのメソッドを使用しようとしているのでNil
)
残念ながら、このエラーの記述方法(undefined method "bar" for Nil:nilClass
)により、このエラーが存在していることに関係しbar
ていると思われがちundefined
です。注意深く読まないと、このエラーにより、初心者は誤ってbar
上のメソッドの詳細Foo
を調べてしまい、オブジェクトが間違ったクラス(この場合はnil)であることを示唆するエラーの一部を完全に見逃してしまいます。エラーメッセージ全体を読むことで簡単に回避できるミスです。
概要:
デバッグを開始する前に、常にエラーメッセージ全体を注意深く読んでください。ことは:常にチェックし、クラスのエラーメッセージにオブジェクトの種類を最初に、次に、その方法を、前にあなたは、エラーが発生するかもしれないと思う場所を任意のスタックトレースやコードの行にsleuthing始めます。この5秒で、5時間のフラストレーションを節約できます。
tl; dr:印刷ログに目を細めないでください。例外を発生させるか、代わりにirbデバッガーを使用してください。デバッグする前にエラーを注意深く読んでウサギの穴を避けてください。
可能な限り変数を出力します。(これはprintfデバッグと呼ばれます)これを行うには、次のコマンドを実行します。
STDERR.puts x.inspect
または
STDERR.puts "Variable x is #{x.inspect}"
これをより簡単に入力したい場合は、エグザンプラー gem を使用できます。
警告をオンにします。ruby
実行している場合は、-w
スイッチで実行します(例:)ruby -w script.rb
。irbから実行していて、1.9.2より前のバージョンのrubyを使用している場合は$VERBOSE = true
、セッションの開始時に入力します。インスタンス変数のスペルを間違えた場合、警告が出されると、
警告:インスタンス変数
@valeus
が初期化されていません
バイナリチョップの概念を理解する(次の引用はアジャイル開発者の実践からのものです)
問題の空間を半分に分割し、どの半分に問題が含まれているかを確認します。次に、その半分をもう一度半分に分けて繰り返します。
バイナリチョップで成功した場合、期待どおりの動作を行わない1行が存在することがあります。例えば
[1, 2, 3].include?([1,2])
false
あなたがそれが返すだろうと思っていても、の値を与えますtrue
。その場合は、ドキュメントをご覧ください。ドキュメントのWebサイトには、ruby-doc.orgまたはAPIdockが含まれます。後者の場合は、include?
右上隅の近くにある虫眼鏡の横に入力し、その下にあるものinclude?
を選択Array
し(クラス[1, 2, 3]
がわからない場合は、[1, 2, 3].class
irbと入力します)、含めますか?(配列)、それが何をするかを説明します。
ただし、ドキュメントが役に立たない場合、なぜスクリプト全体が何をしていないのかではなく、特定の行がどのようにして何をしていないのかについて質問できれば、良い答えが得られる可能性が高くなります。そうすべき。
すべてのものを削除します
2017年へようこそ^ _ ^
さて、あなたが新しいIDEを試すことに反対していなければ、無料で以下を行うことができます。
launch.json
を使用"cwd"
しておよび "program"
フィールドを使用するようにを構成する{workspaceRoot}
"showDebuggerOutput"
し、それを設定しますtrue
"debug.allowBreakpointsEverywhere": true
vscode
。これはVisual Studioと同じではありません。これは無料で軽量であり、一般的には高く評価されています。View->Extensions
.vscode
と呼ばれるファイルを作成しlaunch.json
ます。
launch.json
内容物
{
"version": "0.2.0",
"configurations":
[
{
"name": "Debug Local File",
"type":"Ruby",
"request": "launch",
"cwd": "${workspaceRoot}",
"program": "{workspaceRoot}/../script_name.rb",
"args": [],
"showDebuggerOutput": true
}
]
}
File->Preferences->Settings
(またはCtrl,)を選択し、Debug
セクションに到達するまでスクロールします。それを展開して、呼ばれる"debug.allowBreakpointsEverywhere"
フィールドを探しますtrue
。そのフィールドを選択し、鉛筆のような小さなアイコンをクリックして、に設定します。すべての楽しいことを行った後、2017年半ばと暗いテーマの場合と同様のメニューでブレークポイントを設定してデバッグできるようになります。コールスタックや変数ビューアなどのすべての楽しいもので。
最大のPITAは、1)前提条件のインストール、および2).vscode\launch.json
ファイルの構成を忘れないことです。#2のみが将来のプロジェクトに手荷物を追加する必要があり、上記のような一般的な十分な構成をコピーするだけで済みます。おそらくもっと一般的なconfigの場所がありますが、頭の上からはわかりません。
現時点で適切なツールを選択してコードをデバッグするために、このビデオを強くお勧めします。
https://www.youtube.com/watch?v=GwgF8GcynV0
個人的には、このビデオで2つの大きなトピックを取り上げます。
それは私の2セントです。
他のすべての回答はすでにほとんどすべてを与えています...ほんの少しの追加。
さらにIDEに似たデバッガー(CLI以外)が必要で、Vimをエディターとして使用することを恐れない場合は、Vim Ruby Debuggerプラグインをお勧めします。
そのドキュメントはかなり簡単なので、リンクをたどって見てください。つまり、エディターの現在の行にブレークポイントを設定したり、一時停止時にniftyウィンドウでローカル変数を表示したり、ステップオーバー/インしたりすることができます。ほとんどすべての通常のデバッガー機能です。
Railsの豊富なロガー機能を使用する必要がほとんどなくなったものの、私にとっては、このvimデバッガーをRailsアプリのデバッグに使用することは非常に楽しかったです。
私はこの宝石を発見しました(PryをMRI Ruby 2.0+のデバッガーに変えます)
https://github.com/deivid-rodriguez/pry-byebug
インストール:
gem install pry-byebug
次に、とまったく同じようpry
に使用して、改行する行をマークします。
require 'pry'; binding.pry
バニラてことは異なりただし、この宝石は、いくつかの重要GDBのようなナビゲーションは、次のようなコマンドをしているnext
、step
とbreak
。
break SomeClass#run # Break at the start of `SomeClass#run`.
break Foo#bar if baz? # Break at `Foo#bar` only if `baz?`.
break app/models/user.rb:15 # Break at line 15 in user.rb.
break 14 # Break at line 14 in the current file.
-w
(警告)フラグをオンにするirb
は素晴らしい出発点です。疑わしい小さなチャンクでirbを使用してみてください。ruby-debug(Ruby 1.9+の場合はruby-debug19)が大好きです。実行中のプログラムを停止し、変数を調べ、irbにドロップして、実行を続けることが簡単にできるからです。
Rubyシェルスクリプトを簡単にデバッグするには、最初の行を次のように変更します。
#!/usr/bin/env ruby
に:
#!/usr/bin/env ruby -rdebug
その後、デバッガーコンソールが表示されるたびに、以下を選択できます。
c
続行(次の例外、ブレークポイント、または次の行までdebugger
):n
次の行の場合、w
/ where
フレーム/コールスタックを表示します。l
現在のコードを表示するには、cat
キャッチポイントを表示します。h
さらにヘルプが必要です。参照してください:ルビー・デバッグでデバッグ、ルビー・デバッグ宝石のキーのショートカット。
スクリプトがハングしただけでバックトレースが必要な場合は、次のようにlldb
/ を使用してみてくださいgdb
。
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
プロセスのフォアグラウンドを確認します。
うまく機能lldb
するgdb
場合はに置き換えます。sudo
非所有プロセスをデバッグするための接頭辞。
Ruby 2.4.0以降、Rubyプログラムの途中でIRB REPLセッションを開始する方が簡単です。これらの行を、デバッグするプログラム内の位置に置きます。
require 'irb'
binding.irb
Rubyコードを実行してローカル変数を出力できます。Ctrl + Dを入力するかquit
、REPLを終了してRubyプログラムを実行し続けます。
puts
およびp
を使用して、プログラムの実行中にプログラムから値を出力することもできます。
RubyMineを使用している場合、rubyスクリプトのデバッグは単純で簡単です。
Rubyスクリプトhello_world.rbがあるとします。
以下のように6行目にブレークポイントを設定します。
これで、デバッガーを起動してスクリプトを実行できます。
その後、実行がブレークポイントに到達すると、変数などを検査できるようになります。
printfデバッグ
デバッグ手法については常に論争があり、printステートメントでデバッグしたい人もいれば、デバッガーを深く掘り下げたい人もいます。
両方のアプローチを試すことをお勧めします。
実際、古いUnixの男性の1人は最近、printfデバッグがいくつかの点で彼のために行くためのより速い方法であると言いました。
しかし、仕事に慣れておらず、コードの大きな塊を理解する必要がある場合は、そこを一歩進み、あちこちにいくつかのブレークポイントを置き、それがどのように機能するかを理解することが非常に役立ちます。
これにより、コードがどのように織り込まれているかがある程度理解できるはずです。
他の人のソフトウェアを初めて使用する場合は、そこを一歩進むのに役立つ場合があります。
彼らがそれを巧妙な方法で配置したのか、それが単なるたわごとなのか、すぐにわかります。
まあ、ルビー標準libには、GDBのようなコンソールデバッガを使用して簡単があります http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html 余分な宝石をインストールする必要はありませんが。Railsスクリプトも同様にデバッグできます。
例えば
def say(word)
require 'debug'
puts word
end
すべてのデバッガーの母は、プレーンな古い印刷画面です。ほとんどの場合、いくつかの単純なオブジェクトのみを検査したいと思うでしょう。すばやく簡単な方法は次のとおりです。
@result = fetch_result
p "--------------------------"
p @result
これにより、@ resultの内容が簡単に識別できるように前に行を付けてSTDOUTに出力されます。
ボーナスは、Railsのようなオートロード/リロード対応のフレームワークを使用する場合、アプリを再起動する必要すらありません。(デバッグしているコードがフレームワーク固有の設定のためにリロードされない限り)
これは、私にとってユースケースの90%で機能することがわかりました。ruby-debugを使用することもできますが、ほとんどの場合、やりすぎです。
選択に基づいて、さまざまな機能を持つ多くのデバッガがあります。私の優先事項は、こじ開け動作に満足しました。