我有一个用tcl和bash编写的自定义测试工具(主要在tcl中,一些初始配置和检查由bash完成)。它没有一个确切的起点,外部bash(有时是测试的应用程序)调用特定的函数,它们通过auto_mkindex创建的“tclIndex”文件找到。
此工具创建一个日志文件,其中包含许多“puts”函数,该函数指向文件位置。
大多数函数在开头都有一个“trackBegin”函数调用,在它的末尾有一个“trackEnd”函数。这两个函数名称作为参数。这有助于我们追踪问题所在。
可悲的是,这个跟踪器在近期的一些修改中被遗忘了,它甚至不太可靠,因为它不会跟踪功能中是否有任何异常退出。现在,我试图删除所有这些,并创建一个重命名的_proc来覆盖原始文件,并在执行函数本身之前和之后放置这两个跟踪器。
但我有很多错误(有些我解决了,但我不知道它是最好的方法,有些根本没有解决,所以我卡住了),这些是主要的:
所以我的问题很简单: 我怎样才能解决一个覆盖的proc函数,它会在程序本身之前和之后将日志文件写入“开始”和“结束”块(日志文件位置是从该工具的bash端获得的),当没有时在此工具中清除tcl侧的入口点,并使用auto_mkindex生成的过程索引文件?
谢谢, 罗兰。
答案 0 :(得分:0)
未测试
假设您的bash脚本执行类似
的操作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]
请参阅return
和catch
页面了解如何处理info
字典。
您必须向我们展示一些代码,以提供更具体的帮助,尤其是clock
错误。
答案 1 :(得分:0)
我很想对此使用执行跟踪,并在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
它不会给你相当相同的信息,但它确实允许你以非侵入方式在外面装订代码。