Debugging TCL代码调试器/步进器

Debugging TCL代码调试器/步进器,debugging,tcl,Debugging,Tcl,我想知道是否有一些“最新”的工具允许我调试或逐步完成我的运行代码。我发现的所有程序都严重不推荐使用,并且/或者不能与TCL 8.6一起使用 编辑:更清楚地说,这里正是我需要的: 我需要一个工具,让我看到哪行代码在什么时候执行。我的错误来自外部硬件源,我需要查看硬件出现故障时执行的代码行 您可以尝试跟踪命令执行,如中所述。它将对性能产生相当大的影响,但它可以生成一个详细的日志,准确地记录正在发生的事情。由于要查找与硬件问题相关的内容,您可能还希望使用fconfigure将输出缓冲切换到line(或

我想知道是否有一些“最新”的工具允许我调试或逐步完成我的运行代码。我发现的所有程序都严重不推荐使用,并且/或者不能与TCL 8.6一起使用

编辑:更清楚地说,这里正是我需要的:


我需要一个工具,让我看到哪行代码在什么时候执行。我的错误来自外部硬件源,我需要查看硬件出现故障时执行的代码行

您可以尝试跟踪命令执行,如中所述。它将对性能产生相当大的影响,但它可以生成一个详细的日志,准确地记录正在发生的事情。由于要查找与硬件问题相关的内容,您可能还希望使用
fconfigure
将输出缓冲切换到
line
(或
none
;如果只编写完整的行,则差异无关紧要)


在Linux上运行时查找硬件问题的另一种方法是尝试使用。这会记录系统调用的情况,这可能非常有用。如果您正在查看日志,请注意,Tcl的实现在使用事件循环时调用了大量的
gettimeofday();这是预期的、正确的行为。

这不是辅导的地方,但我真的建议您看看tkcon
提供的内省和检查工具。一个简单且非常简短的示例:您从
tkcon
启动了一些代码,这些代码包括晦涩而复杂的命令
foo
。您怀疑出了什么问题,因此输入命令
edit-type proc-foo
,并获得一个包含文本的窗口

proc foo {} {
    for {set i 0} {$i < 10} {incr i} {
        set a [expr {2*$i}]
    }
}
proc foo{}{
对于{set i 0}{$i<10}{incr i}{
设置一个[expr{2*$i}]
}
}
您决定跟踪对
a
的更改,并在正文中输入
观察变量a write
,作为新的第一个命令。然后在
Send to…
菜单中选择
Send to slave
,这意味着
foo
现在在主
tkcon
窗口中重新定义。再次运行代码时,对
a
的更改将记录到
tkcon
控制台窗口(以
set a…
命令字符串的形式)

返回编辑窗口,可以通过插入命令
idebug break
添加断点。如果在控制台窗口中输入命令
idebug on
,并再次运行代码,执行将在此时停止,您将得到一个交互式提示,在这里您可以爬升/下降调用堆栈,列出变量,获取堆栈跟踪,还可以执行任意命令来更改变量值等

如果在编辑窗口中对命令进行了重大更改,则可以将其保存到新文件或附加到旧文件(Tcl源文件可以有同一命令的多个定义:仅使用最后一个定义)。如果不保存,则原始源将保持不变。您甚至可以使用同一命令打开多个编辑窗口,并分别编辑它们,尝试不同的变体

您还可以将
tkcon
源代码转换为自己的代码,并使用
tkcon show
获得一个控制台窗口,该窗口了解程序的状态


在控制台中输入命令
edit-type file$argv0
,应该可以查看最终文档
tkcon
的源代码

到目前为止,我发现最好的是ramdebugger,但我想你可能已经尝试过了。我有时会做的一个技巧是将tkcon附加到正在运行的程序上(如果它是Tk程序,这很容易)。然后在tkcon中,我可以编辑函数、调用函数、编辑全局变量等,这只是一个控制台窗口,对吗?是的。但它实现了一个非常有用的编辑命令。例如,您可以键入
编辑变量name
,它将在编辑器窗口中打开该变量的值。或者
编辑procname
,它将在编辑器窗口中打开该proc的定义。基本上,你可以在运行程序的函数中插入puts。你不需要任何源代码,你只需要启动
tkcon
,然后使用
edit
idebug
observe
等命令。看看这些命令。我想,我们大多数人在这里都有点不知所措,因为Tcl编程基本上不需要这样的结构化调试工具。Tcl已经成为我的主要语言超过15年了;目前,我使用自己制作的工具进行数据提取/分析,老实说,我很少进行真正的调试(尽管我非常虔诚地使用测试工具。)Tcl在许多方面都是一种不同的语言:它的内省工具以及人们可以改造、重塑的便捷性,并且动态地重塑代码,使调试变得不那么重要。