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
が生成されます 結果をファイルします。
これは静的分析ではないことに注意してください。これは実際にメソッドを呼び出します!
ファイルパスの表示
これらのメソッドがどこで定義されているか知りたいですか?
心配しないでください、私はあなたをカバーしました!各メソッド呼び出しのファイルパスを表示できるようにするオプションを追加しました。
VisualCallGraph.trace(show_path: true) { Foo.aaa }
結果 :
いくつかの大規模なコールグラフを見たい場合は、いくつかの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
について学びました クラス。メソッド呼び出しや新しいスレッドなどのいくつかのイベントをトレースできます。これは、デバッグツールとして、またはコード探索に役立ちます。
この投稿を共有することを忘れないでください より多くの人が楽しめるように🙂
-
iPhone で削除された通話履歴を復元する方法:3 つの方法
iPhone の通話履歴は、本当に必要になるまでほとんど無視されます。残念ながら、削除された通話を復元するのは簡単ではありません。 iPhone がログを管理する方法を変更するためにできることはあまりなく、通話用の「最近削除された」フォルダもありません。幸いなことに、選択肢があります。 以下は、iPhone で削除された通話ログを復元する 3 つの異なる方法です…さらに、データを復元せずに iPhone で削除された通話を表示する 3 つの方法のボーナス (これについては次に説明します)。読み進めてください。 iPhone が通話履歴を削除するのはなぜですか? iPhone の通話履歴機能
-
Excel で依存関係をトレースする方法 (2 つの簡単な方法)
Excel で作業中 、依存関係を追跡する方法を知ることが重要です 一連のデータで。 依存関係を追跡することを知る のデータが Excelに役立ちます ユーザーは、セル内のデータが他のセルにどのように依存しているかを知ることができます。 扶養家族の追跡 エクセルで 必要なときにワークブックを便利にします。この記事では、依存関係を追跡する方法を学びます。 エクセルで 2 つの簡単で便利な方法で。 練習用ワークブックをダウンロードして練習してください。 Excel で依存関係を追跡する 2 つの簡単な方法 ABC Traders の半年売上高のデータセットを見てみましょう .データセットは 3