at posts/single.html

デバッグ用にメソッドの呼び出し元(スタックトレース)をログに出力する方法

ちょっとした小ネタ。 Ruby スクリプトをデバッグするときに、あるメソッドがどこから呼び出されたのかを知りたいときがある。 普通ならデバッガとブレークポイントを使えばいいんだろうけど、 CGI で動作するスクリプトなどでデバッガが使えないときもある。

そんなときは、メソッド内で意図的に例外を発生させ、即座に例外をキャッチすればいい。 キャッチした例外オブジェクトの backtrace メソッドを呼び出せば、メソッドの呼び出し元を調べることができる。

def some_method
  begin
    raise Exception.new
  rescue Exception => e
    STDERR.puts e.backtrace.join(", ")
  end

  # ここから関数本体
end

このサンプルは CGI を想定しているので、標準エラー出力にスタックトレースを書き出している(Apache HTTP サーバの場合は、 error_log で読むことができる)。 ちなみに、改行ではなくカンマで連結しているのは、余計なデータが付与されるのを防ぐため。 改行で連結すると、スタックトレースの一行ごとに、 error_log の整形情報(日付、ログレベル、リファラ)が付与されてしまう。

関連する日記