«前の日記(2009-10-02 (金)) 最新 次の日記(2009-10-19 (月))»  

まちゅダイアリー


2009-10-18 (日)

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

ちょっとした小ネタ。 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 の整形情報(日付、ログレベル、リファラ)が付与されてしまう。

Tags: Ruby
本日のツッコミ(全2件) [ツッコミを入れる]
nagachika (2009-10-18 (日) 15:16)

caller メソッドでもスタックトレースが取れると思うのですがどうでしょう?

まちゅ (2009-10-19 (月) 13:02)

この方法は知りませんでした。<br>caller を使う方がシンプルで良いですね。<br>ありがとうございます。