有没有人举例说明如何使用Tcl_CreateObjTrace?这是使用TclLib将Tcl调用跟踪添加到C代码的过程。
我的主要问题是:我正在尝试为我的Tcl代码开发一个跟踪器。但是,我只想跟踪我自己的程序。以下代码有效:
static int
tcl_tracer( ClientData clientData,
Tcl_Interp* interp,
int level,
CONST char* command,
Tcl_Command commandToken,
int objc, Tcl_Obj *CONST objv[])
{
int param_length = 0;
CONST char *param_str = NULL;
int i;
/**
* The first three parameters represent the procedure
*/
if (objc < 2) {
printf("Invalid number of parameters for the tracer: %d\n", objc);
return TCL_OK;
}
param_str = Tcl_GetStringFromObj(objv[0], ¶m_length);
printf("%d:%s ", 0, param_str);
param_str = Tcl_GetStringFromObj(objv[1], ¶m_length);
printf("%d:%s ", 1, param_str);
param_str = Tcl_GetStringFromObj(objv[2], ¶m_length);
printf("%d:%s ", 2, param_str);
printf("\n");
return TCL_OK;
}
但是,它会跟踪所有程序。它跟踪'puts','set'等。 有什么办法可以避免吗?有一个参数可以指定跟踪级别。但我事先并不知道我的代码可以运行多少级别。
非常感谢。
-Ilya。
答案 0 :(得分:0)
正如该页面提到的那样,将Tcl_CreateObjTrace
调用的 flags 参数设置为TCL_ALLOW_INLINE_COMPILATION
将禁用最具侵入性的跟踪级别(特别是,许多常见的核心命令是字节码编译为正常,并设置了该标志。)
也就是说,通过trace add execution
从Tcl级别挂钩到这个机制要容易得多;在您感兴趣的每个命令上设置enter
跟踪(抱歉,您必须列出它们)应该可以解决问题。 (这是有效的,因为trace
内部可以以你的代码不能的方式关闭大量的成本。这是相当棘手的,也是我讨厌处理trace
命令实现的原因之一。)