tcllib Tcl_CreateObjTrace使用示例

tcllib Tcl_CreateObjTrace使用示例,tcl,Tcl,有人举过如何使用的例子吗?这是使用TclLib将Tcl调用跟踪添加到C代码的过程 我的主要问题是:我正试图为我的Tcl代码开发一个跟踪程序。但是,我只想跟踪我自己的过程。以下代码起作用: static int tcl_tracer( ClientData clientData, Tcl_Interp* interp, int level, CONST char* command, Tcl_Command commandToken,

有人举过如何使用的例子吗?这是使用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;
}
static int
tcl_跟踪程序(ClientData ClientData,
Tcl_Interp*Interp,
整数级,
CONST char*命令,
Tcl_命令commandToken,
int objc,Tcl_Obj*常量objv[]
{
int param_length=0;
CONST char*param_str=NULL;
int i;
/**
*前三个参数表示程序
*/
if(objc<2){
printf(“跟踪器的参数数无效:%d\n”,objc);
返回TCL_OK;
}
param_str=Tcl_GetStringFromObj(objv[0],¶m_length);
printf(“%d:%s”,0,参数str);
param_str=Tcl_GetStringFromObj(objv[1],¶m_length);
printf(“%d:%s”,1,参数str);
param_str=Tcl_GetStringFromObj(objv[2],¶m_length);
printf(“%d:%s”,2,参数str);
printf(“\n”);
返回TCL_OK;
}
但是,它跟踪所有过程。它跟踪“放置”、“设置”等。 有什么办法可以避免吗?有一个参数指定跟踪级别。但我事先不知道我的代码可以运行多少层

非常感谢


-Ilya.

如该页所述,将调用的flags参数设置为
TCL_ALLOW_INLINE_COMPILATION
将禁用最具侵入性的跟踪级别(特别是,许多常见的核心命令都是按照该标志集正常编译的字节码)


这就是说,从Tcl层面到;在您感兴趣的每个命令上设置
enter
trace(抱歉,您必须列出它们)应该可以做到这一点。(这是因为
trace
内部可以以代码无法实现的方式降低很多成本。这相当棘手,也是我讨厌处理
trace
命令实现的原因之一。)

是的,TCL\u ALLOW\u INLINE\u编译在某些时候起到了作用(它确实消除了许多内置Tcl调用,但不是全部。是否可以使用跟踪所有用户过程,或者必须手动为每个过程进行注册?@ilya您必须注册每个过程。这并不难,因为您可以使用[info procs]列出全局过程。)然后在列表上迭代添加跟踪。或者你可以重载进程(说明如何)自动添加跟踪。嗨,多纳尔:非常好的建议。非常感谢。