9

如何在 TCL 中找到过程(函数)的位置。在位置下,我的意思是声明它的源文件。

我正在尝试阅读外国源代码,但找不到单个过程的声明,例如:

set MSISDNElement [regexp -all -inline {ISDN +[0-9]+} $Command]

if { $MSISDNElement != "" } {
    foreach elm $MSISDNElement {
        set MSISDNValue [list ISDN [getInternationalFormat [lindex $elm 1]]]
    }
}

set EptData [list [lindex $Command 1]]

InitEptData 3
foreach Element $EptData {
    SetEptData [lindex $Element 0] [lindex $Element 1]
}

对于函数InitEptDataSetEptData我找不到任何声明。可以更深入了解 TCL 的人来解释如何解决我面临的问题吗?提前致谢!

4

3 回答 3

10

对此没有通用答案,因为 Tcl 允许您动态声明过程,因此它们可能没有实际的文件引用。

有一些尝试来改善具有定义文件的 procs 的情况,例如TIP280,它实际上info frame在最近的 8.5 版本中可用,以及 TIP 86 ,它只是在讨论中。

但是,如果一个简单grep的方法不起作用,您可以跟踪创建过程或命令的那一刻。

这发生在不同的地方(Tcl OO 可能会添加更多,不确定):

  • 在命令期间,当二进制扩展使用Tcl_CreateCommand或更现代的 Tcl_CreateObjCommandload注册其命令处理函数时。
  • source加载具有 proc 定义的文件的命令期间
  • 在运行proc命令本身以定义新过程时

使用这些命令info commandsnamespace children您可以遍历整个命名空间树以获取执行命令之前和之后定义的命令列表。因此,您可以创建一个跟踪任何新命令的包装器。请参阅http://wiki.tcl.tk/1489了解如何操作的一些提示。

或者,只需使用 RamDebugger http://www.compassis.com/ramdebugger/Intro之类的调试器或 ActiveStates 商业调试器。

于 2012-09-29T11:18:20.733 回答
0

在 bash shell 中,我使用:

 find . -name "*.tcl" -exec grep -H proc_name_to_find {} \; | grep proc

这会找到所有 tcl 文件,然后对每个文件执行 grep 以搜索 proc_name_to_find,然后再次对包含 'proc' 的行的输出进行 grep

由于grep -H输出带有输出字符串的文件名,因此这会向您显示在编辑器中查找定义所需的输出。

示例

$ find . -name "*.tcl" -exec grep -H set_prime {} \; | grep proc
./my_lib.tcl:proc prime_test::set_prime {{quiet 0} {no_compare 0}} {

xargs 还有其他解决方案...

于 2014-07-23T23:32:21.177 回答
0

它不会捕获瞬态定义的 procs,也可能不会重命名 procs,但在 99% 的情况下,这应该可以工作并且非常容易。如果您发现全局命名空间中有两个 proc 但首先调用了一个意外的 proc,它也将帮助您解决问题。

假设我的 proc 是“doBlah”,我可以这样做:

    array get ::auto_index doBlah

假设我只知道它包含字符串'lah',我可以这样做:

    array get ::auto_index *lah*

在这两种情况下,您都会返回 auto_index 的内容,它会告诉您当您尝试运行该 proc 时 Tcl 将获取哪个文件。

于 2022-02-23T16:31:17.493 回答