Shiro Kawai
shiro****@lava*****
2004年 1月 2日 (金) 21:13:18 JST
From: "K.Sasada" <ko1****@namik*****> Subject: [Gauche-devel-jp] how to get stack trace string? Date: Fri, 02 Jan 2004 20:55:09 +0900 > スタックトレースについて質問です。 > > 1. 任意の時点でスタックトレースを文字列として取得可能でしょうか。 > 2. できるならば、どのように取得すればよいでしょうか。 可能ですが、仕様がまだ確定していないため、undocumentedに なっています。使う際は一応それを頭に置いておいて下さい。 いくつか方法があります。 (1) 文字列として取得する方法 デフォルトのエラーメッセージ(スタックトレース含む)は、 report-errorという手続きで生成されています。 report-error <error> これは、直接(current-error-port)にメッセージを吐くので、 次のように呼んでやれば、スタックトレースを含んだメッセージを 文字列として取得可能です。 (with-error-handler (lambda (e) (call-with-output-string (cut with-error-to-port <> (cut report-error e)))) (lambda () ...)) 但し、スタックトレースに関しては、report-errorが呼ばれた時点の スタックの状態を表示します (エラーオブジェクト e にスタックの情報が 入っているわけではない)。従って、上のように書いた場合、with-error-handler 等が作るスタックも表示に含まれてしまいます。 今後の仕様変更という点では、report-errorが最も安全 (変更される 可能性が少ない) と思います。 (2) vm-get-stack-trace, vm-get-stack-trace-liteを用いる vm-get-stack-trace [vm] vm-get-stack-trace-lite [vm] これらは、呼ばれた時点のスタックの情報をfirst class objectに 変換して返します。vm-get-stack-trace-lite は各スタックフレームに 該当するコードのリストを、vm-get-stack-traceはそれに加えて 環境情報を返します。 vm-get-stack-traceの方は、lib/gauche/vm/debugger.scm で 使ってるので見てみて下さい。(このモジュールもまだ仕様が確定していないので undocumentedです)。 使い易さから言えば、エラー発生時点でトレース情報を生成して エラーオブジェクトに付加してしまうのがいいんですが、 トレース情報をfirst class objectにする処理が重いので (スタックフレームをコピーする必要がある)、やっていません。 --shiro