使用Tcl库和/或Tcl内部组件的Tcl脚本非插装调试器

Tcl scripts non-instrumenting debugger using Tcl Library and/or Tcl internals?

本文关键字:Tcl 脚本 调试器 组件 库和 内部 使用      更新时间:2023-10-16

我想知道是否有可能使用tcl库API和/或tcl内部接口构建tcl脚本调试器(我的意思是如果它们包含足够的数据来这样做)。我注意到现有的tcl调试器使用tcl脚本并使用这个附加层。我的想法是使用Tcl_CreateObjTrace来跟踪每个评估的命令,并将其用作检索callstack, locals等的点。问题是,在评估时,似乎不是每个信息都可以从API访问。例如,我想知道哪一行当前被评估,但Interp只有顶部评估有这样的信息(iPtr->cmdFramePtr->line对于过程的主体是空的)。有人尝试过这种方法吗?这有意义吗?也许我应该看看Interp中的散列条目?如果有任何提示和意见,我们将不胜感激(对于Tcl 8.5来说是最好的)。

对于非侵入式调试系统,最好的方法可能是尝试使用info frame执行步骤跟踪(在执行跟踪所附加的命令期间调用的每个命令都调用)来实际获取信息。下面是一个简单的版本,附加到source,以便您可以观看整个脚本:

proc traceinfo args {
    puts [dict get [info frame -2] cmd]
}
trace add execution source enterstep traceinfo
source yourscript.tcl

为大量输出做好准备。info frame之外的字典可以包含各种相关条目,例如关于命令的行号和源文件的信息;cmd条目是被调用命令的未被替换的源(如果您想要替换的版本,请参阅上面跟踪回调函数traceinfo的相关参数)。