trace, untrace - デバッグのために手続きを追跡する
使い方
trace(f)
trace(f,g,h,...)
debug(f)
debug(f,g,h,...)
untrace(f)
untrace(f,g,h,...)
undebug(f)
undebug(f,g,h,...)
パラメータ
f, g, h, ... - 追跡する手続き名
|
説明
|
|
•
|
trace 関数はデバッグのための道具で、手続き f, g, h などの実行を追跡します。
|
•
|
モジュールも 1 つの手続き名として与えても構いません。この場合は、そのモジュールのすべてのエクスポートされた変数も追跡されます。この操作は再帰的なので、すべてのサブモジュール内のすべてのエクスポートされた手続きもまた追跡されます。
|
•
|
実行中は、追跡される手続きの開始時点、実行された命令文の結果 (以下を参照)、終了時点が印字されます。手続きに入った時点では、その実パラメータが表示されます。終了の時点では、その関数の戻り値が出力されます。
|
•
|
追跡中に表示される情報量は評価される式 (式の中で追跡されることになる部分) がコロンで終わるか、セミコロンで終わるかに依存します。コロン (":") で終わるときには、その手続きの開始時点と終了時点が印字されるだけです。セミコロン (";") で終わるときには、実行された命令文の結果も印字されます。
|
•
|
それぞれの手続きの開始時点は行頭に左括弧 ("{") を添えて印字されます。デリミッター・マッチング機能のあるテキストエディタを使って追跡結果を見れば、これを利用して、対応する手続きの開始時点と終了時点の間をジャンプすることができます。
|
•
|
untrace 関数はその引数の追跡を解除します。
|
•
|
trace (untrace) 関数は追跡を設定 (解除) した手続き名の式列を返します。
|
•
|
stopat や unstopat で使うものと似た特別な構文を使うと、モジュールの中の局所手続きを追跡することができます。モジュール m が局所変数として手続き g を含んでいれば、trace( m::g ) というコマンドを実行することで g を追跡することができます。同様に、g の追跡を中止するときは、untrace( m::g ) を実行します。ただし、この場合には、式 g の型は symbol であり、大域変数として扱われている必要があります。(このモジュールの局所変数を参照する特別な方法はデバッグ関連の関数を利用するときだけに意味があります。それはモジュールの局所変数を参照するために一般的な構文を与えるものではありません。)
|
•
|
次のような特殊な評価規則を持っている関数のいずれも追跡不可能であることに注意しましょう: assigned, eval, evalhf, evalf evaln, seq, userinfo.
|
•
|
trace 関数は追跡可能な手続き名になっていない引数は黙って無視します。特に、anames() の中の多くの名前に手続きが割り当てられていないとしても、trace(anames()) を実行することで、現在割り当てのある名前に対応するすべての手続きを追跡することができます。
|
•
|
debug と undebug は trace と untrace の別名です。
|
|
|
例
|
|
>
|
f := proc(x) local y; y := x * 2; g(x) / 4; end proc;
|
| (2.1) |
>
|
g := proc(x) local z; z := x^2; z * 2; end proc;
|
| (2.2) |
| (2.3) |
{--> enter f, args = 3
{--> enter g, args = 3
<-- exit g (now in f) = 18}
<-- exit f (now at top level) = 9/2}
| (2.4) |
{--> enter f, args = 3
{--> enter g, args = 3
<-- exit g (now in f) = 18}
<-- exit f (now at top level) = 9/2}
| |
>
|
m := module()
export f;
local g;
g := proc( x )
local y;
y := 2 * x;
y
end proc;
f := x -> g( x / 3 );
end module:
trace( m::g );
|
| (2.5) |
{--> enter g, args = 2/3
<-- exit g (now in f) = 4/3}
| (2.6) |
| (2.7) |
| (2.8) |
|
|