まちゅダイアリー

トップ «前の日記(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 の整形情報(日付、ログレベル、リファラ)が付与されてしまう。

本日のツッコミ(全2件) [ツッコミを入れる]
■1 nagachika (2009-10-19 (月) 00:16)

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

■2 まちゅ (2009-10-19 (月) 22:02)

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


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