trace

ReferenceTOPKeywords

コマンド名

trace -変数のアクセス、コマンドの使用、及びコマンドの実行を監視します

構文

trace option ?arg arg ...?

解説

本コマンドによってある演算か操作が行なわれるときに、引数によってTclコマンドが実行されます。使用できるoption ( 省略可能 )は下記の通りです。

trace add type name ops ?args?
trace add command name ops command
rename
delete
trace add execution name ops command
enter
leave
enterstep
leavestep
For leave and leavestep operations:
trace add variable name ops command
array
read
write
unset
trace remove type name opList command
trace remove command name opList command
trace remove execution name opList command
trace remove variable name opList command
trace info type name
trace info command name
trace info execution name
trace info variable name
trace variable name ops command
trace vdelete name ops command
trace vinfo name
trace add type name ops ?args?
ここでのtype commandexecutionまたは variableです。
trace add command name ops command
コマンドnameがリストops によって与えられた方法のどれかで変更されるとき、commandコマンドを実行するための手配をします。name はプロシージャで使われる通常のnamespace命名規則に従います。引数コマンドが存在しない場合はエラーが発生します。

ops は監視する操作を示す次のアイテムの1以上を含むリストです。

rename
引数コマンドname が改名されるときにcommandを呼び出します。空の文字列へ改名する場合は削除とみなしますのでrenameでトレースできません。

delete
引数コマンドname が削除されるとき、commandを呼び出します。コマンドは rename によってコマンド名を空の文字列に改名することで明白に削除されます。インタープリタが削除されるとき、コマンドも同時に削除されますが、この場合トレースを実行させるインタープリタがないのでトレースは行いません。

そのトレースがトレースされたオペレーションに応じていくつかの引数を誘発するとき、commandに付加される現実のコマンドが次のとおりであるように

command oldName newName op

OldName、及びnewNameは、それが改名されつつある ( 空のストリング、これが'削除'処理の場合 ) 名前の場合、トレースされたコマンドの現在の ( 古い ) 名前を与えます。Opはどのようなオペレーションがコマンドに関して行われつつあるかを示し、上で定義されたように rename〜、もしくはdeleteのいずれかです。トレースオペレーションはコマンドが削除されるのを阻止するために使われることができません。いったん、そのトレースが完了すれば、Tclはコマンドを常に削除するでしょう。再帰的に改名する、及び削除することによって同じタイプの更なるトレースは評価されなくなります。このように、コマンドをそれ自身が改名するような、削除するトレースを削除する、及び改名するトレースは、更なるトレース評価を引き起こさなくなります。

trace add execution name ops command
コマンドnameがリストops によって与えられた方法のうちの1つで修正されるときはいつでも、実行するcommandを手配します。name は、プロシージャによって使われる通常のnamespace解決規則を用いて解決されます。コマンドが存在しない場合、エラーとなるでしょう。

ops はどのオペレーションに関心があるかを示し、そして次のアイテムの1つ以上のリストに:

enter
コマンドname が実行されるときはいつでも、現在の実行が行われる前にcommandを呼び出します。

leave
コマンドname が実行されるときはいつでも、現在の実行が行われた後でcommandを呼び出します。

enterstep
プロシージャの中で実行される全てのtclコマンドのために、現在の実行が行われる前にcommandを呼び出します。例えば、` proc foo {} {puts "Hello"} 'がある場合、puts"Hello"が実行される前にenterstepトレースが起動されます。enterstepトレースをcommandに置くことはエラーに帰着せず、単に無視することになります。

leavestep
プロシージャの中で実行される全てのtclコマンドのために、現在の実行が行われた後でcommandを呼び出します。leavestepトレースをcommandに置くことはエラーに帰着せず、単に無視することになります。

そのトレースがトレースされたオペレーションに応じていくつかの引数を誘発するとき、 次のように、現在のコマンドはcommandに付加されます。:これはenter及びenterstepオペレーションのために行われます。:

command command-string op

command-stringは ( enterオペレーションのためのトレースされたコマンド、enterstepオペレーションのための任意のコマンド ) 、それらの十分に拡張されたフォームにおける全ての引数を含めて、完全な現在の命令の実行を与えます。Opはどのようなオペレーションがコマンド実行に関して行われているかを示し、そして、上で示したようにenter、またはenterstepのうちのいずれかです。トレースオペレーションは、問題のコマンドを削除することによって、そのコマンドが実行をとめることができます。当然、コマンドが続いて実行され、'invalid command 'エラーが発生するときもです。

leave、及びleavestepオペレーションの場合
command command-string code result op

command-stringは ( enterオペレーションのためのトレースされたコマンド、enterstepオペレーションのための任意のコマンド ) 、これらの十分に拡張されたフォームにおける全ての引数を含めて、完全な現在の命令の実行を与えます。 codeは、結果ストリングをその実行の結果コード、及びresultに与えます。 Opはどのようなオペレーションがコマンド実行に関して行われているかを示し、そして上で示したように、leave、またはleavestepのうちのいずれかです。1つのトレースからの呼び出されたコマンドは他のトレースのための更なるコマンド呼出しにつながることができるので、多くのenterstep、またはleavestepトレースの作成が直観的でない結果 につながることができることに注意してください。command実行する時、それが起動されたコードと同じコンテキストにおいて、トレースされたオペレーションのようにプロシージャから実行された場合、そのcommandは、プロシージャのコードと同じローカル変数へのアクセスを持っているます。このコンテキストは、そのトレースが作成されたコンテキストとは異なるかもしれません。commandがその時プロシージャ ( それが通常行う ) を呼び出すならば、あるいはそれがトレース演算に起動されたコードの局所変数にアクセスすることを望むならば、そのプロシージャはupvar、またはuplevelを使わなければならななりません。commandは実行トレースの間、実行中であると同時に、name に関するトレースは一時的に無効にされます。これは、commandが再び他のトレースに訴えずにそのボディにおけるname を実行することを可能にします。commandボディを実行している間にエラーが発生した場合、その後、command名前のすべては、そのエラーを返すことになります。多重トレースがname に置かれるとき、enter及び、enterstepオペレーションのためにトレースされたコマンドは、トレースが本来、どのように作成されてきたか逆の順番に呼び出されます。そして、leave、及びleavestepオペレーションのために、トレースされたコマンドは、作成されたオリジナルの順番で呼び出されます。実行トレースの行動は、現在、別 のnamespaceにインポートされたコマンドname のために定義されません。

trace add variable name ops command
変数がリストops によって与えられた方法のうちの1つでアクセスされるときは、実行されさせるcommandを手配します。name は、正常な変数、配列のエレメント、もしくは配列全体を参照するかもしれません ( すなわち、挿入語句を入れられたインデックスなしで、名前は単に配列の名前であるかもしれません) 。name が全ての配列を参照する場合、配列のあらゆるエレメントが操作されるときはいつでも、commandが呼び出されます。その変数が存在しないならば、作成されるますが、しかし、値を与えられません。従って、 info existではなくnamespaceで参照されます。
 
ops はどちらのオペレーションが関心であるかを示し、そして、次のアイテムの1以上のリストです。

array
array命令が呼び出される時、name がスカラー変数ではない限り、その変数は arrayコマンドによってアクセスされます、もしくは修正されるときはいつでも、commandを呼び出します。name がスカラ変数である場合、 arrayコマンド経由のアクセスは、トレースしません。

read
変数が読まれるときはいつでも、commandを呼び出します。

write
変数が書かれるときはいつでも、commandを呼び出します。

unset
変数が設定されないときはいつでも、commandを呼び出します。変数は、 unsetコマンドによって明白にアンセットされ、もしくはプロシージャが戻る時、暗黙にアンセットされます ( それらの局所変数の全てがセットされない場合 ) 。 インタープリタが削除されるとき、変数は同じくアンセットされます、しかし、実行するインタープリタがないので、トレースは行使されません。

トレーストリガの現在のコマンドが次のとおりである場合、3つの引数は、commandに付加されます。

command name1 name2 op

Name1、及びname2は、アクセスされた変数のためにname ( s ) を与えます。その変数がその時スカラであるならば、name1は変数の名前を与え、そしてname2は空のストリングになります。その変数がその時配列要素であるならば、name1はアレイの名前を与え、そしてname2はインデックスをアレイに与えます。全体のアレイが削除されつつあり、単一のエレメントというよりはむしろ、そのトレースが全体のアレイ上で登録されたならば、name1はアレイ名前を与え、そしてname2は空のストリングになります。Name1、及びname2は、トレース変数コマンドに使われるname として必ずしも同じであるとは限りません。upvarコマンドはプロシージャが異なるname の下で変数を参照することを可能にします。Opは、上で定義されたように、 read、writeまたは、 unsetのいずれかの、どのようなオペレーションが変数に関して行われつつあるかを示します。

それが起動されたコードと同じコンテキストにおいて、トレースされたオペレーションのcommand実行する場合、その変数がTclプロシージャの一部としてアクセスされたなら、commandはプロシージャのコードと同じローカル変数へのアクセス権を持っています。このコンテキストは、そのトレースが作成されたコンテキストとは異なる場合もあります。commandが、その時プロシージャ (それが通常行う) を呼び出す場合、そのプロシージャがアクセスのトレースされた変数を望むなら、 upvar、または uplevelを使わなければなりません。注意事項として、同じくそのname がトレースを変数に置いたものと、name1が必ずしも同様であるとは限りません。そのアクセスが upvarコマンドによって定義された変数によって行われるならば、差異は発生し得ます。

読込み、そして書込みトレースのためのcommandは、トレースされたオペレーションの結果 に影響を及ぼすために、変数を修正します。commandが読込み、もしくは書込みトレースの間に変数の値を修正する場合、新しい値はトレースされたオペレーションの結果 として返されます。それリターンする時同じくあらゆるソートそしてトレースされたオペレーションのエラートレースコマンドによって返された同じエラーメッセージによってエラー返すということを除けばコマンドからのリターン値無視されます( 例えば、このメカニズムがリードオンリー変数を実行するために使われます ) 。書込みトレースのために変数の値が、書込みオペレーションにおいて指定されたオリジナルの値をオーバライドすることで変数に新しい値に書き変えられた後で、commandは呼び出されます。リードオンリー変数でcommandを実行する場合、変数の古い値を回復しなければなりません。

commandの読み込み、もしくは書込みトレース実行中である場合、変数に関するトレースは、実行と同時に、一時的に無効にされます。これは、それが読み込み、書込みが行使されているあいだで、再びcommand( 或いは、他のトレース ) を呼び出さずに、commandは直接、動きます。 commandがアンセットをセットしないければ、トレースは起動されます。

アンセットトレースが行使されるとき、トレースなしでは定義されないように思われるでしょうが、既にその変数は削除されています。アンセットがプロシージャリターンのために発生するならば、そのトレースは、戻りさきのプロシージャのスタックフレームはもはや存在しないでしょうが、返されたプロシージャの変数コンテキストにおいて行使されます。 トレースはアンセットトレースの間には無効にされません。従って、アンセットトレースコマンドが新しいトレースを作成し、そして、変数にアクセスするなら、そのトレースは行使されるます。アンセットトレースにおけるあらゆるエラーは無視されます。

変数に関して多重トレースがあるならば、それらは、最も最近、作られた順に行使されます。1つのトレースがエラーを返した場合、それ以降のトレースは変数のために行使されません。配列要素がトレースセットを持っており、同じく全体としてアレイに置かれたトレースがあるならば、全体のアレイ上のトレースはエレメント上の1つ以前に行使されます。

いったん作成されたトレースは、そのトレースが下で述べるトレース削除variableコマンドによって除去されるまで、そのトレースが同様に有効な状態を維持すれば、その変数がアンセットされるまで、もしくはそのインタープリタが削除されるまで、残ります。アレイのエレメントをセットしないことは、あらゆるトレースをそのエレメントから除去します。しかし、トレースを全体のアレイから除去しません。

このコマンドは、空のストリングを返します。
trace remove type name opList command
typeは、どちらのcommandでも、executionまたは variableです。
trace remove commandname opList command
opList、及びcommandによって与えられたオペレーション、及び命令によってコマンドname に置かれたトレースがある場合、またcommandが再び呼び出されなかった場合、そのトレースは、削除されます。空のストリングを返します。name が存在しない場合、このコマンドはエラーを返します。

trace remove execution name opList command
opList、及びcommandによって与えられたオペレーション、及び命令によってコマンドname に置かれたトレースがある場合、またcommandが再び呼び出されなかった場合、そのトレースは、削除されます。空のストリングを返します。name が存在しない場合、このコマンドはエラーを返します。

trace remove variablename opList command
opList、及びcommandによって与えられたオペレーション、及び命令による変数name に置かれたトレースがある場合、またcommandが再び呼び出されなかった場合、そのトレースは、削除されます。空のストリングを返します。

trace info type name
typeは、どちらのコマンドでも、execution、または、 variableです。

trace info command name
現在コマンドname に置かれた各トレースのために1つのエレメントを含むリストを返します。リストの各エレメントは、それ自体2つのエレメント ( トレースと関連していたopList、及びcommandです ) を含むリストです。name がトレースをセットされた状態にしなければ、コマンドの結果 は空のストリングです。name が存在しない場合、そのコマンドはエラーを返します。

trace info execution name
現在コマンドname に置かれた各トレースのために1つのエレメントを含むリストを返します。リストの各エレメントは、それ自体2つのエレメント ( トレースと関連していたopList、及びcommandです) を含むリストです。name がトレースをセットされた状態にしなければ、コマンドの結果 は空のストリングです。name が存在しない場合、そのコマンドはエラーを返します。

trace info variable name
現在変数name に置かれた各トレースのために1つのエレメントを含むリストを返します。リストの各エレメントは、それ自体2つのエレメント ( トレースと関連していたopList、及びcommandす ) を含むリストです。name が存在しない、及びトレースをセットされた状態に全くしなければ、コマンドの結果 は空のストリングです。

次の、互換性ある、3の他のサブ‐コマンドが利用可能です:

trace variable name ops command
これは、trace add variableと同様です。
trace vdelete name ops command
これは、trace remove variableと同様です。
trace vinfo name
これは、trace info variableと同様です。

これらのサブ‐コマンドは、Tclの将来のバージョンで多分、無くなるでしょう。それらは、使用するには古いシンタックスで、 array readなどや、write unsetrw、及びuのそれぞれ、(そしてops 引数はリストではありません。しかし、単にオペレーションのストリング連結、rwuaのように)によって交換されます。

参照

set unset

キーワード

read command rename variable write trace unset


Copyright © 1993 The Regents of the University of California. Copyright © 1994-1996 Sun Microsystems, Inc. Copyright © 2000 Ajuba Solutions. Copyright © 1995-1997 Roger E. Critchlow Jr.