これを行うための公式のAPIは、トレースです。特に、は、バイトコードコンパイルを無効にするので、コマンドトラッキングはバイトコードコンパイルされたコマンドに対して正しく動作します。はい、それは遅いですが、それは正確に何が起こっているのかを正確に追跡するために得られるものです。また、NCL(非再帰的実行エンジン)実装のコマンドもあり、有用な方法ではobjProc
フィールドを使用しないので、あなたがやっていることもTcl 8.6で解消されます。私たちは、Tclの将来のバージョン(ネイティブコードのコンパイルなど)のためにさらに大きな変更を見ています。物事を傍受するあなたの能力は、そこではさらに減ります。
要するに、あなたがやろうとしていることが、現在うまく機能しているものに強く反対しているように、別のアプローチを使用する必要があります。たとえば、制御するコードによって作成されたすべてのプロシージャまたはコマンドをインターセプトするだけで十分であり、オーバーヘッドが大幅に削減されます。手順を傍受する最も簡単な方法は、proc
コマンドを書き換えることである:
rename proc my_real_proc
my_real_proc proc {name arguments body} {
set body "[list my_trace_hook $name];$body"
uplevel 1 [list my_real_proc $name $arguments $body]
}
あなたは、その後の手順は、あなたが好きな機構によりmy_trace_hook
でまで何であるかについての情報を得ることができます。それはフックされた手順の内側から呼び出されます。それはすべてのTclコマンドが何をするのかを追跡することはありませんが、そのレベル追跡を加えることは常にパフォーマンスに大きな影響を与えます(I/Oコマンドだけに追加することは別です)。
なぜ、アンサンブル自体をトラッキングしていますか?その中のサブコマンドを追跡するだけです。 Tcl C APIは、コマンドが簡単にアンサンブルであるかどうかを知ることができ、他のイントロスペクションオプションも提供します。
私はサブコマンドを追跡することを考慮しなかった、私はそれを試してみる、ありがとう! – Bogdan