F83には非常に単純なデバッガがある。
・使用方法
debug ワード としてデバッグするワードを指定すると、以降ワードを実行するとスタックの内容を表示して入力待ちになる
例
: fact dup 0= if drop 1 else dup 1- recurse * then ; ok
debug fact ok
3 fact 3
DUP --> (入力待ち)
入力待ち状態で、
・スペースあるいは改行で次へ
・Q デバッグ終了
・F Forthの実行が可能
デバッガへの戻りは resume
・C ステップモード(入力待ちあり)からトレースモード(スタックを印字するが入力待ちしない)へ移行し実行を続行
DUP 3 3
0= 3 0
?BRANCH 3
DUP 3 3
1- 3 2
FACT 3 2
DUP 3 2 2
.......
デバッグ終了は
unbug
・注意点1
Cで戻るとトレースモードになるが、その後ステップモードに戻る方法がない
強制的に戻すには 変数 slow に 0 を代入することが必要。(slow は vocabulary bugに定義されている)
: stepping 0 [ bug ] slow ! ; とか : tracing -1 [ bug ] slow ! ; とか定義して置くのが良いかも
・注意点2
内部的なことだが、debugワードでは不審な点がある。
その1
: DEBUG (S -- )
' 2- DUP [ BUG ] 'UNNEST (DEBUG) ;
ここで「2-」しているは、CFA->PFAなので「2+」ではないだろうか?
その2
: 'UNNEST (S Pfa -- Pfa' )
BEGIN 1+ DUP @ ['] UNNEST = UNTIL ;
ここで「1+」しているが、ワード中のUNNESTを探している訳なので「2+」ではないだろうか?
・注意点3
デバッグはアドレス範囲で指定されているため、forgetしてワードを消しても残る。
・注意点4
debug は簡易なので以下のようなことが起きる。
' unnest . 361 ok なので、
: test 1 . 2 . 361 . 3 . 4 . ; ok
test 1 2 361 3 4 ok
debug test ok
test 2 0
1 --> 2 0 1
. --> 1 2 0
2 --> 2 0 2
. --> 2 2 0
(LIT) --> 361 3 4 ok
リテラルの361をunnestと判断して範囲が設定されるため、そこで終わってしまう。
※コメント投稿者のブログIDはブログ作成者のみに通知されます