tcllib Tcl_CreateObjTrace用法示例

时间:2012-02-13 23:14:36

标签: tcl

有没有人举例说明如何使用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], &param_length);
    printf("%d:%s ", 0, param_str);
    param_str = Tcl_GetStringFromObj(objv[1], &param_length);
    printf("%d:%s ", 1, param_str);
    param_str = Tcl_GetStringFromObj(objv[2], &param_length);
    printf("%d:%s ", 2, param_str);

    printf("\n");
    return TCL_OK;
}

但是,它会跟踪所有程序。它跟踪'puts','set'等。 有什么办法可以避免吗?有一个参数可以指定跟踪级别。但我事先并不知道我的代码可以运行多少级别。

非常感谢。

-Ilya。

1 个答案:

答案 0 :(得分:0)

正如该页面提到的那样,将Tcl_CreateObjTrace调用的 flags 参数设置为TCL_ALLOW_INLINE_COMPILATION将禁用最具侵入性的跟踪级别(特别是,许多常见的核心命令是字节码编译为正常,并设置了该标志。)

也就是说,通过trace add execution从Tcl级别挂钩到这个机制要容易得多;在您感兴趣的每个命令上设置enter跟踪(抱歉,您必须列出它们)应该可以解决问题。 (这是有效的,因为trace内部可以以你的代码不能的方式关闭大量的成本。这是相当棘手的,也是我讨厌处理trace命令实现的原因之一。)