如何找到TCL程序的位置?
Posted
技术标签:
【中文标题】如何找到TCL程序的位置?【英文标题】:How to find the location of TCL procedure? 【发布时间】:2012-09-21 00:28:28 【问题描述】:如何在 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]
对于函数 InitEptData 和 SetEptData 我找不到任何声明。可以更深入了解 TCL 的人来解释如何解决我面临的问题吗?提前致谢!
【问题讨论】:
一般来说,您无法找到过程的位置(因为 Tcl 为您提供了eval
在运行时动态、动态地定义它的能力)。在实践中,您可以使用文本查找(例如 Linux 上的 grep
)来查找某个名称的定义出现。
另外,有些程序实际上是由一些用C编译的可执行代码定义的。
@Basile Starynkevitch:是的,就是这种情况!谢谢!
【参考方案1】:
在 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 还有其他解决方案...
【讨论】:
【参考方案2】:对此没有通用答案,因为 Tcl 允许您动态声明过程,因此它们可能没有实际的文件引用。
有一些尝试来改善具有定义文件的 procs 的情况,例如 TIP280,在最近的 8.5 版本中实际上以 info frame
的形式提供,以及 TIP 86,仅在讨论中。
但如果一个简单的grep
不起作用,您可以跟踪创建过程或命令的那一刻。
这发生在不同的地方(Tcl OO 可能会添加更多,不确定):
在load
命令期间,当二进制扩展使用Tcl_CreateCommand 或更现代的Tcl_CreateObjCommand 注册其命令处理函数时。
在 source
命令加载具有 proc 定义的文件时
在运行 proc
命令本身定义新过程时
使用命令info commands
和namespace children
,您可以遍历整个命名空间树以获取执行命令之前和之后定义的命令列表。因此,您可以创建一个跟踪任何新命令的包装器。请参阅http://wiki.tcl.tk/1489 了解如何操作的一些提示。
或者,只需使用 RamDebugger http://www.compassis.com/ramdebugger/Intro 之类的调试器,或 ActiveStates 商业调试器。
【讨论】:
一个简短的建议:定义新命令时,通常会删除旧命令(rename
会抛出错误)。因此,具有该名称的 nop proc 和删除跟踪会告诉您何时删除旧命令。以上是关于如何找到TCL程序的位置?的主要内容,如果未能解决你的问题,请参考以下文章