編集/コンパイル/リンク/テスト の開発ループが遅い言語では、 デバッグを容易にするために高度な トレース/ステッピング デバッガが必要になる傾向があります。
高速コンパイル言語でのより良い(より速い)方法は、 適切に選択した場所に表示コード(printing code)を追加し、 プログラムを実行してその出力を見て、 問題が発生した箇所を確認し、 バグが見つかるまでさらに表示コード等を追加することです(訳注: C言語で言うところの printf デバッグすると言っている)。
debugs.fs で提供される単純なデバッグ支援機能は、 このスタイルのデバッグをサポートすることを目的としています。
~~
というワードは、 デバッグ情報(デフォルトではソースの場所とスタックの内容)を出力します。
これは簡単にソース・コードに挿入できます。 Emacs を使用している場合は、 削除も簡単です(Emacs Forth モードで C-x ~
を実行すると、 ~~
を ""(nothing) に query-replace します)。 defer ワード
printdebugdata
と .debugline
は、 ~~
の出力を制御します。
デフォルトのソース位置出力形式は Emacs のコンパイル・モードで適切に動作するため、 C-x `
を使用してソース・レベルでプログラムをステップ実行できます(ステップ実行デバッガーと比較した利点は、 任意の方向にステップ実行でき、
クラッシュが発生した場所や奇妙なデータが発生した箇所を知る事ができるということです)。
~~
( – ) gforth-0.2 “tilde-tilde”
~~
を記述したソース・コードの場所とスタックの内容を .debugline
を使って出力します。
printdebugdata
( – ) gforth-0.2 “print-debug-data”
.debugline
( nfile nline – ) gforth-0.6 “print-debug-line”
nfile nline で示されるソース・コードの場所と追加のデバッグ情報を出力します。 デフォルトの .debugline
は、 printdebugdata
を使用して追加情報を出力します。
debug-fid
( – file-id ) gforth-1.0 “File-id”
デバッグ用の出力先。 デフォルトでは、 当該プロセスの stderr
です。
~~
(およびアサート(assertions))は、 その出現後に同一ファイル内で marker が実行されると、 通常、
間違ったファイル名を出力します。 ~~
(およびアサート(assertions))は、 その出現前に同じファイル内で marker
が実行されると、 ファイル名として「どこか」(somewhere)を出力します。
once
( – ) gforth-1.0 “once”
once
から THEN までの操作を 1 回だけ だけ実行します(訳注: 1度実行されるとその旨を body に書き込むので、
再度実行するには once
を含む定義を「忘れ」(forget)て再度定義(読み込み)する必要がある)
~~bt
( – ) gforth-1.0 “~~bt”
スタック・ダンプとバックトレースを出力
~~1bt
( – ) gforth-1.0 “~~1bt”
スタックダンプとバックトレースを(once
と同様) 1 回だけ実行します
???
( – ) gforth-0.2 “???”
デバッグ・シェルを実行します
WTF??
( – ) gforth-1.0 “WTF??”
バックトレースとスタック・ダンプを使用してデバッグ・シェルを実行します
!!FIXME!!
( – ) gforth-1.0 “!!FIXME!!”
決してこの場所に到達してはいけないワード(訳注: -2605 を throw する)
replace-word
( xt1 xt2 – ) gforth-1.0 “replace-word”
xt2 が xt1 を実行するようにします。 両方ともコロン定義である必要があります。(訳注:
: foo ." foo" ;
: bar ."
bar" ;
foo foo ok
bar bar ok
’ foo ’ bar replace-word ok
foo foo
ok
bar foo ok
~~Variable
( "name" – ) gforth-1.0 “~~Variable”
アクセスごとにワッチされる(~~
する)変数(variable を ~~variable に一時的にリネームする)
~~Value
( n "name" – ) gforth-1.0 “~~Value”
アクセスごとにワッチされる(~~
する) value ( value を 一時的に ~~value にリネームする)
+ltrace
( – ) gforth-1.0 “+ltrace”
行単位のトレースをONにする。
-ltrace
( – ) gforth-1.0 “-ltrace”
行単位のトレースをOFFにする
#loc
( nline nchar "file" – ) gforth-1.0 “#loc”
次のワードの場所を "file" の nline nchar と設定します