使用proc重命名在日志中跟踪过程

时间:2014-06-11 14:27:50

标签: tcl rename proc

我有一个用tcl和bash编写的自定义测试工具(主要在tcl中,一些初始配置和检查由bash完成)。它没有一个确切的起点,外部bash(有时是测试的应用程序)调用特定的函数,它们通过auto_mkindex创建的“tclIndex”文件找到。

此工具创建一个日志文件,其中包含许多“puts”函数,该函数指向文件位置。

大多数函数在开头都有一个“trackBegin”函数调用,在它的末尾有一个“trackEnd”函数。这两个函数名称作为参数。这有助于我们追踪问题所在。

可悲的是,这个跟踪器在近期的一些修改中被遗忘了,它甚至不太可靠,因为它不会跟踪功能中是否有任何异常退出。现在,我试图删除所有这些,并创建一个重命名的_proc来覆盖原始文件,并在执行函数本身之前和之后放置这两个跟踪器。

但我有很多错误(有些我解决了,但我不知道它是最好的方法,有些根本没有解决,所以我卡住了),这些是主要的:

  1. 因为没有确切的入口点,我应该在哪里定义以及如何覆盖此过程中的所有过程?我的一些文件必须手动修改为_proc才能工作(主要是那些程序外有代码的程序,这些文件作为脚本被调用,而不是通过tclIndex的函数,被称为1的函数都在utils文件夹中,并且只有那里,也许它可以帮助)。
  2. 在跟踪线上,我放置了一个带格式的“时钟”,它总是导致异常退出。
  3. 我遇到了返回值的问题(如果有的话,有些时候没有)。即使那是回归,也可以退出。
  4. 所以我的问题很简单: 我怎样才能解决一个覆盖的proc函数,它会在程序本身之前和之后将日志文件写入“开始”和“结束”块(日志文件位置是从该工具的bash端获得的),当没有时在此工具中清除tcl侧的入口点,并使用auto_mkindex生成的过程索引文件?

    谢谢, 罗兰。

2 个答案:

答案 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]

请参阅returncatch页面了解如何处理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

它不会给你相当相同的信息,但它确实允许你以非侵入方式在外面装订代码。