如何通过Tcl解释器获得触发的进程命令列表



我想知道是否有可能检查在执行期间运行的解释器(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使用起来有点棘手,需要实验来获得正确的关卡选择器,因为如果有"聪明的"代码生成游戏正在玩,则结果字典中有趣的键(通常是fileline用于代码位置信息)不能保证在那里。


在高度事件驱动的Tk应用程序中,这可能还不够;您很可能需要向过程添加跟踪,以便跟踪回调。或者您可以更改应用跟踪的方式,以便在Tk回调处理期间也启用它们:

trace add execution source enterstep DebugStepTrace
trace add execution tkwait enterstep DebugStepTrace
source main.tcl
tkwait window .

tkwait window调用基本上是wish在运行您指定的脚本后为您做的事情。我们显式地这样做,以便我们可以跟踪它运行时发生了什么。

相关内容

  • 没有找到相关文章

最新更新