Gauche > Archives > 2014/01/18

2014/01/18 10:29:32 UTCwasao
#
こんばんは。 Gauche HEADでこんな感じのプログラムを実行するとStack Traceの表示がおかしくなります。最適化の影響でしょうか。
#
(define (f)                                                                                                
  (cond [(not (values #t))
         (print 'none)]
        [else
         (error 'error-message)])
  (print 'end))

(f)
#
% gosh -f no-inline f.scm
*** ERROR: error-message
Stack Trace:
_______________________________________
  0  (print 'none)
        At line 3 of "./f.scm"
2014/01/18 11:26:22 UTCshiro
#
エラー発生時のPCからソース位置を割り出すところが間違ってるっぽいですね。
2014/01/18 18:12:06 UTCshiro
#
ああ、わかった。
2014/01/18 18:17:39 UTCshiro
#
んーどうしようかな。
2014/01/18 19:50:50 UTCshiro
#
普通のCPUでは、callインストラクションは自分の次のインストラクションのアドレスをpushする。スタックトレースを見る時は、pushされたアドレスのひとつ手前を見れば、何をcallしていたかがわかる。
#
Gauche VMはcallと継続のpushが分かれていて、callインストラクションそのものは本質的に単なるジャンプである。そのcallがどこに戻ってくるかはあらかじめpushされた継続によって決まり、必ずしもcallインストラクションの次に戻って来るとは限らない。
#
今回の場合、(print 'none)と(error 'error-message)の継続はともに(print 'end)へと合流してて、スタックを見ただけじゃ直前にどっちを呼んでたかわからないんだな。デバッグ情報をさがすルーチンは合流の可能性を考えてなくて、今回の場合たまたま(print 'none)の方がコード上で後に位置していたのでそっちを見つけちゃった。
#
で、どう直すかだが、本質的に合流後の継続だけ見ても直前にしようとしてた作業はわからないので、継続push時に余分なデバッグ情報を付け加えてやるしかなさそうだ。