Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyメソッドをスパイする方法

Rubyには、TracePointを使用してアクセスできるトレースシステムが組み込まれています。 クラス。トレースできるものには、メソッド呼び出し、新しいスレッド、および例外があります。

なぜこれを使いたいのですか?

さて、特定のメソッドの実行を追跡したい場合に便利です。他にどのようなメソッドが呼び出されているか、および戻り値は何かを確認できます。

いくつかの例を見てみましょう!

メソッド呼び出しのトレース

ほとんどの場合、TracePointが必要になります 組み込みメソッド(プット、サイズなど)ではなくアプリケーションコードをトレースするため。

これは、callを使用して行うことができます イベント。

def the_method; other_method; end
def other_method; end

def start_trace
  trace =
  TracePoint.new(:call) { |tp| p [tp.path, tp.lineno, tp.event, tp.method_id] }

  trace.enable
  yield
  trace.disable
end

start_trace { the_method }

これにより、ファイルパス、行番号、イベント名、メソッド名が出力されます。

["test.rb", 1, :call, :the_method]
["test.rb", 2, :call, :other_method]

イベントを指定しない場合、Rubyはそれらすべてに対してブロックを呼び出し、より多くの出力をもたらします。したがって、特定のイベントに焦点を合わせて、必要なものをより速く見つけることをお勧めします🙂

これがTracePointの表です イベント:

イベント名 説明
電話 適用方法
c_call 経営幹部レベルのメソッド(プットなど)
return メソッドreturn(戻り値と呼び出しの深さをトレースするため)
b_call 通話をブロックする
b_return ブロックリターン
レイズ 例外が発生しました
thread_begin 新しいスレッド
thread_end スレッドの終了

TracePoint + Graphviz

多くのメソッドは、特にフレームワークコードで、3つ以上のメソッド呼び出しを行うため、Tracepointからの出力 視覚化するのが難しい場合があります。

そこで、次のような視覚的なコールグラフを作成できるgemを作成しました:

require 'visual_call_graph'

VisualCallGraph.trace { "Your method call here..." }

これにより、call_graph.pngが生成されます 結果をファイルします。

Rubyメソッドをスパイする方法

これは静的分析ではないことに注意してください。これは実際にメソッドを呼び出します!

ファイルパスの表示

これらのメソッドがどこで定義されているか知りたいですか?

心配しないでください、私はあなたをカバーしました!各メソッド呼び出しのファイルパスを表示できるようにするオプションを追加しました。

VisualCallGraph.trace(show_path: true) { Foo.aaa }

結果

Rubyメソッドをスパイする方法

いくつかの大規模なコールグラフを見たい場合は、いくつかのRailsメソッドをトレースする必要があります😉

戻り値

はじめに、戻り値も取得できると述べました…

このためには、returnをトレースする必要があります イベントを実行し、return_valueを使用します メソッド。

def the_method; "A" * 10; end

trace = TracePoint.new(:return) { |tp| puts "Return value for #{tp.method_id} is #{tp.return_value}." }

trace.enable
the_method
trace.disable

これは印刷されます:

Return value for the_method is AAAAAAAAAA.

最初のイベント

誰かがredditで、fooを呼び出すときに「bar」という単語が印刷されないようにする方法を尋ねました。 次のコードのメソッド:

class Thing
  def foo
    puts "foo"
    bar
  end

  def bar
    puts "bar"
  end
end

# your code here

t = Thing.new
t.foo

モジュールの先頭に追加したり、$stdoutをリダイレクトしたりするなど、これを実現する方法はたくさんあります。 またはbarを再定義します メソッド。

あなたが創造性を感じているなら、あなた自身の考えでこの投稿にコメントしてください!

しかし、TracePointを使用していたので、答えの1つが特に興味深いと思いました。 クラス。

こちら

TracePoint.trace(:call) { |tp| exit if tp.method_id == :bar }
の場合は終了します

このコードはexitを呼び出します メソッドbar が呼び出され、プログラムを終了して文字列が印刷されないようにします。

おそらく実際のコードで使用したいものではありませんが、TracePointについて1つのことを証明しています。 :イベントは発生する前にトリガーされます。

これを中心に何らかのツールを構築する場合は、注意が必要です🙂

概要

この投稿では、TracePointについて学びました クラス。メソッド呼び出しや新しいスレッドなどのいくつかのイベントをトレースできます。これは、デバッグツールとして、またはコード探索に役立ちます。

この投稿を共有することを忘れないでください より多くの人が楽しめるように🙂


  1. iPhone で削除された通話履歴を復元する方法:3 つの方法

    iPhone の通話履歴は、本当に必要になるまでほとんど無視されます。残念ながら、削除された通話を復元するのは簡単ではありません。 iPhone がログを管理する方法を変更するためにできることはあまりなく、通話用の「最近削除された」フォルダもありません。幸いなことに、選択肢があります。 以下は、iPhone で削除された通話ログを復元する 3 つの異なる方法です…さらに、データを復元せずに iPhone で削除された通話を表示する 3 つの方法のボーナス (これについては次に説明します)。読み進めてください。 iPhone が通話履歴を削除するのはなぜですか? iPhone の通話履歴機能

  2. Excel で依存関係をトレースする方法 (2 つの簡単な方法)

    Excel で作業中 、依存関係を追跡する方法を知ることが重要です 一連のデータで。 依存関係を追跡することを知る のデータが Excelに役立ちます ユーザーは、セル内のデータが他のセルにどのように依存しているかを知ることができます。 扶養家族の追跡 エクセルで 必要なときにワークブックを便利にします。この記事では、依存関係を追跡する方法を学びます。 エクセルで 2 つの簡単で便利な方法で。 練習用ワークブックをダウンロードして練習してください。 Excel で依存関係を追跡する 2 つの簡単な方法 ABC Traders の半年売上高のデータセットを見てみましょう .データセットは 3