Tcl 使用proc renaiming在日志中跟踪过程
我有一个用tcl和bash编写的定制测试工具(主要是在tcl中,一些初始配置和检查是由bash完成的)。它没有一个确切的起点,外部bash(有时是被测试的应用程序)调用特定的函数,它们通过auto_mkindex创建的“tclIndex”文件找到这些函数 该工具创建一个日志文件,具有许多“puts”功能,指向文件位置 大多数函数在开头有一个“trackBegin”函数调用,在结尾有一个“trackEnd”函数。这两个函数将函数名作为参数。这有助于我们跟踪问题所在 不幸的是,这个跟踪器在不久前的一些修改中被遗忘了,它甚至不太可靠,因为它不会跟踪函数中是否存在任何异常退出。现在,我尝试删除所有的跟踪程序,并创建一个重命名的_proc来覆盖原始跟踪程序,并在函数本身执行前后放置这两个跟踪程序 但是我有很多错误(有些我解决了,但我不知道这是最好的方法,有些根本没有解决,所以我被卡住了),这些是主要的错误:Tcl 使用proc renaiming在日志中跟踪过程,tcl,rename,proc,Tcl,Rename,Proc,我有一个用tcl和bash编写的定制测试工具(主要是在tcl中,一些初始配置和检查是由bash完成的)。它没有一个确切的起点,外部bash(有时是被测试的应用程序)调用特定的函数,它们通过auto_mkindex创建的“tclIndex”文件找到这些函数 该工具创建一个日志文件,具有许多“puts”功能,指向文件位置 大多数函数在开头有一个“trackBegin”函数调用,在结尾有一个“trackEnd”函数。这两个函数将函数名作为参数。这有助于我们跟踪问题所在 不幸的是,这个跟踪器在不久前的一
tclsh file.tcl
你可以
tclsh instrumented.tcl file.tcl
其中instrumented.tcl将包含
proc trackBegin {name} {...}
proc trackEnd {name output info} {...}
rename proc _proc
_proc proc {name args body} {
set new_body [format {
trackBegin %s
catch {%s} output info
trackEnd %s $output $info
} $name $body $name]
_proc $name $args $new_body
}
source [lindex $argv 0]
有关如何使用info
词典的信息,请参见和页面
您必须向我们展示一些代码,以提供更具体的帮助,特别是针对您的
时钟错误。我会尝试使用执行跟踪来实现这一点,并在proc
上的执行跟踪中添加执行跟踪(毕竟,这只是一个常规的Tcl命令)。特别是,我们可以这样做:
proc addTracking {cmd args} {
set procName [lindex $cmd 1]
uplevel 1 [list trace add execution $procName enter [list trackBegin $procName]]
uplevel 1 [list trace add execution $procName leave [list trackEnd $procName]]
}
proc trackBegin {name arguments operation} {
# ignore operation, arguments might be interesting
...
}
proc trackEnd {name arguments code output operation} {
# ignore operation, arguments might be interesting
...
}
trace add execution proc leave addTracking
它并没有提供完全相同的信息,但它确实允许您非侵入性地在外部装订代码。可能无法解决眼前的问题,但请查看tcllib logger跟踪功能,因为它提供了一个工作系统,用于在禁用时以零运行时成本跟踪过程的进入/退出。()在8.6中使用try
…最终
可能会更容易…我尝试了你的方法,这显然是一个进步。有一些新的信息:TCL版本是:7.6.x(根据配置检查)找到了调用第一个TCL文件的点,并将示例代码的修改版本放在那里。某些部分正在工作,但当它开始从tcl索引调用第一个过程时,它会崩溃。我发现,它生成的是空的。我知道这段代码是在这些新的跟踪器下调用的,但我不知道为什么它现在不工作。另一个问题是,我的日志现在包含了很多“::tcl::tm::…”类似于每个tcl库函数的行。我怎样才能使标准函数不被注销,只从我的“utils”文件夹中注销(这些被列在tcl索引中)?如果{[string match::tcl*[namespace current]]}{set new_body$body}或者{…}
--可能不是“namespace current”,可能是$name
,那么你就必须使用类似于。测试和查看一些问题是通过这种方法解决的,最新的是使用环境变量。这个旧工具使用了大量的env变量来与它的多个部分进行通信。现在,由于原始入口点已使用跟踪器文件进行了修改(在堆栈中向上放置了1级),因此环境变量不起作用。在原始文件的函数中定义的那些函数在它们之外是不可访问的。我试图使它们在函数级或文件级上全局化,但没有解决问题。有什么想法吗?(我仍在尝试屏蔽标准过程跟踪)