Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl 使用proc renaiming在日志中跟踪过程_Tcl_Rename_Proc - Fatal编程技术网

Tcl 使用proc renaiming在日志中跟踪过程

Tcl 使用proc renaiming在日志中跟踪过程,tcl,rename,proc,Tcl,Rename,Proc,我有一个用tcl和bash编写的定制测试工具(主要是在tcl中,一些初始配置和检查是由bash完成的)。它没有一个确切的起点,外部bash(有时是被测试的应用程序)调用特定的函数,它们通过auto_mkindex创建的“tclIndex”文件找到这些函数 该工具创建一个日志文件,具有许多“puts”功能,指向文件位置 大多数函数在开头有一个“trackBegin”函数调用,在结尾有一个“trackEnd”函数。这两个函数将函数名作为参数。这有助于我们跟踪问题所在 不幸的是,这个跟踪器在不久前的一

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

该工具创建一个日志文件,具有许多“puts”功能,指向文件位置

大多数函数在开头有一个“trackBegin”函数调用,在结尾有一个“trackEnd”函数。这两个函数将函数名作为参数。这有助于我们跟踪问题所在

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

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

  • 因为没有确切的入口点,我应该在哪里定义这个被重写的过程,以及如何在这个执行过程中处理所有的过程?我的一些文件必须手动修改以使_proc正常工作(大多数文件在过程之外有代码,这些文件作为脚本被调用,而不是通过tclIndex调用函数,被调用的函数都在utils文件夹中,只有在那里,它可能会有所帮助)
  • 在跟踪器行中,我放置了一个带有格式的“时钟”,它总是导致异常退出
  • 我对返回的值有问题(如果有,有时没有)。即使那是一次返回或退出
  • 简言之,我的问题是: 我如何解决重写的proc函数,该函数将在过程本身之前和之后将“开始”和“结束”块写入日志文件(日志文件位置是从该工具的bash端获得的),而该工具中没有针对tcl端的明确入口点,并使用自动生成的过程索引文件

    谢谢, 罗兰。

    未经测试

    假设您的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]
    
    有关如何使用
    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级),因此环境变量不起作用。在原始文件的函数中定义的那些函数在它们之外是不可访问的。我试图使它们在函数级或文件级上全局化,但没有解决问题。有什么想法吗?(我仍在尝试屏蔽标准过程跟踪)