web-dev-qa-db-ja.com

ruby)でサードパーティのgemをデバッグするための最良の方法

Ruby gemの中にはGhost Methodsがたくさんあるかもしれないので、Ruby gemの内部メカニズムをただで研究するのは良い考えではないと思います。ソースコードを静的に読み取る。サードパーティのgemのソースファイルを実行中のRubyプロセスに添付してデバッグし、ブレークポイントを設定して動的に動作することを確認する方法はありますか?
BTW、「require」ステートメントのコンテキストメニュー「GoTo-> Implementations」または3番目のシンボルをクリックして、RubyMineのサードパートgemのソースファイルに移動しようとしました。 -part gem(require 'watir'など)、成功しませんでした。 IDEなどの動的型付け言語のRubyがシンボルナビゲーションに失敗するのは正常ですか?

35
TomCaps

これを行うためのより良い方法があるかどうか知りたいのですが、私が通常行う方法は次のとおりです。

  1. Ruby-debug gemをGemfileに追加します(または、Ruby 1.9.2)を使用している場合はRuby-debug19)
  2. bundle show gemnameを実行して宝石を見つけます。私はMacを使用しているので、通常これをpbcopyにパイプして、クリップボードにコピーします。 bundle show Rails | pbcopy
  3. お気に入りのエディタでgemディレクトリを開きます。 mvim /path/to/gem/directory
  4. ブレークポイント*を配置するファイルと行に移動し、問題の行の上にdebuggerを挿入します。
  5. ページをリロードするか、テストを実行するか、Gemファイルを実行するために必要なことをすべて実行します
  6. デバッガーで実行が停止したら、変数(p variable_name)を調べて、 Rubyデバッガーコマンド を使用して1行ずつ移動できます。

*ブレークポイントを配置する場所を知っていると、コードをある程度理解できますが、lib /gemname.rbから始める必要があります。

47
Peter Brown

現在受け入れられている回答で提案されているように、Gemファイルを編集することは避けます。代わりに、アプリファイルの1つにdebuggerコマンドを配置し、breakコマンドを使用してgemにブレークポイントを設定します。 rvmgemsetを使用しているので、次のようにします。

break /Users/chris/.rvm/gems/Ruby-1.9.3-p125@<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>

14
Chris Beck

どちらのコマンドも、コンピューターのgemソースへのパスを出力します。

# if it is present in your gemfile
bundle show gemname

# if not in your gemfile
gem which gemname

次に、選択したテキストエディタでフォルダを開くだけで、適切にデバッグできます。

1
Flavio Wuensche

prygemは私のために働きます。

bundle add pry --group "development, test"

また、binding.pryを使用している.rbファイルにpryが必要です。

require 'pry'

これが GitHubリンク

0
Chimed Palden

Rubyのように実行時にコードを変更する言語では、シンボルやメソッドなどの起源を100%正確に予測することは困難です。

私はソースコード分析を必要とする多くのサードパーティの宝石を扱っていますが、このタスクに最適なツールは Netbeans +その Ruby and Rails =プラグイン

  • 依存するgemソースコードでの適切なナビゲーションを可能にします(他の選択肢とは異なります)
  • 実際に機能する視覚的なブレークポイントとデバッグ(トレースとすべてを使用)**

**生成されたコードブロック(each {}など)のメソッド呼び出しにいくつかの不具合がありますが、私はそれらに対処することを学びました。

私が通常行うことは、ブレークポイントを設定し、実行時にコードを分析することです。

0
clyfe