我想知道是否有可能检查在执行期间运行的解释器(procscommands) ?按照他们跑步的顺序?
背景:我需要看看脚本是如何工作的,并把一些(我的)代码放在一个特定的地方。
您需要一个执行跟踪。特别是,enterstep
模式将为每个被调用的命令提供回调(在相当大的性能损失下),leavestep
模式还允许您查看该命令的结果(许多命令的结果为空)。
开始使用它们的一个地方是通过制作一个包装器脚本,将跟踪放在source
上,然后在主脚本中放置source
。
proc DebugStepTrace {command op args} {
puts "ENTER: $command"
}
trace add execution source enterstep DebugStepTrace
source main.tcl
在几乎所有的实际代码中,这会产生一个巨大的量的输出。特别是,您可能会被所有proc
调用所淹没。让我们做一个更微妙的跟踪器,隐藏一些信息,以便您可以看到更大的画面。
proc DebugStepTrace {command op args} {
set trimmed [regsub {n.*} $command "..."]
puts "ENTER: $trimmed"
}
# Apply this procedure to [source] as above, of course
您也可以在过程中使用info script
(通常不推荐,但在这种情况下是正确的)和info frame
来获取更多信息:
proc DebugStepTrace {command op args} {
# Trim off everything after the first newline for sanity
set trimmed [regsub {n.*} $command "..."]
# Basic guess at extended info
set filename [file tail [info script]]
set line 0
# May have better information in the frame
set frame [info frame -2]
if {[dict exists $frame file]} {
set filename [file tail [dict get $frame file]]
set line [dict get $frame line]
}
# Print what we've discovered
puts "ENTER:${filename}:${line}:$trimmed"
}
info frame
使用起来有点棘手,需要实验来获得正确的关卡选择器,因为如果有"聪明的"代码生成游戏正在玩,则结果字典中有趣的键(通常是file
和line
用于代码位置信息)不能保证在那里。
在高度事件驱动的Tk应用程序中,这可能还不够;您很可能需要向过程添加跟踪,以便跟踪回调。或者您可以更改应用跟踪的方式,以便在Tk回调处理期间也启用它们:
trace add execution source enterstep DebugStepTrace
trace add execution tkwait enterstep DebugStepTrace
source main.tcl
tkwait window .
tkwait window
调用基本上是wish
在运行您指定的脚本后为您做的事情。我们显式地这样做,以便我们可以跟踪它运行时发生了什么。