デバッグ難航 - Scheme VM を書く

コンパイラVM on Gauche で動かしている。
特定のコードをコンパイルしようとするとコードが想定しない動きをして落ちてしまう。


原因をひたすら調べている。

  • おかしくなる手続きを特定
  • 同じ引数で呼んでみる →落ちない
  • pass1 の展開結果を見る →正常
  • コンパイル結果を眺める →正常に見える


ちとお手上げ気味なので VM の状態が正常かどうかを 1 インストラクション毎にチェックすることにした。
以下は補助マクロ

(define-macro (debug-case val . clauses)
  `(case ,val
     ,@(map (lambda (x) `(,(car x)
                         (let1 debug-clause (quote ,(car x))
                           ,@(cdr x))))
            clauses)))

(define-macro (check-vm-paranoia pred)
  `(unless ,pred
     (error "** vm check paranoia " (quote ,pred) " on " debug-clause)))

debug-case マクロは case の代わり使うことで各 clause 内で debug-clause という変数が参照できるようになります。