這樣做的官方API是跟蹤。特別是,禁用字節碼編譯,因此命令跟蹤對於字節碼編譯的命令正常工作。是的,速度較慢,但這正是您準確跟蹤發生了什麼事的原因。此外,你正在做的事情也會在Tcl 8.6中脫節,因爲它也有NRE(非遞歸執行引擎)實現的命令,並且它們不以任何有用的方式使用objProc
字段。我們正在考慮對未來版本的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