[Gauche-devel-jp] Re: how to get stack trace string?

アーカイブの一覧に戻る

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
 








Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る