2012-02-13 138 views
1

有沒有人有如何使用Tcl_CreateObjTrace的示例?這是使用TclLib將Tcl調用追蹤添加到C代碼的過程。tcllib Tcl_CreateObjTrace用法示例

我的主要問題是:我試圖爲我的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。

回答

0

由於該網頁提到,設置標誌的Tcl_CreateObjTrace調用TCL_ALLOW_INLINE_COMPILATION參數將禁用跟蹤的最侵入水平(尤其是許多共同的核心命令字節碼編譯正常與標誌)。

也就是說,從Tcl級別通過trace add execution鉤住這個機制實際上更容易;在你感興趣的每個命令上設置一個enter跟蹤(對不起,你必須列出它們)應該可以做到。 (這是有效的,因爲trace內部可以通過代碼無法關閉很多代價,這是相當棘手的,也是我討厭處理trace命令的原因之一)

+0

Yes,TCL_ALLOW_INLINE_COMPILATION一些時間工作。 :(它確實消除了很多內置的Tcl調用,但不是全部。 是否可以使用[trace add execution](http://www.tcl.tk/man/tcl8.5/TclCmd/trace.htm) #M9)來跟蹤所有的用戶程序,或者必須手動完成每個程序的註冊? – ilya1725 2012-02-14 18:40:36

+0

@ilya您必須註冊每個程序,這不是_that_難,因爲您可以使用[info procs]列出全局程序並且然後遍歷這個列表來添加追蹤,或者你可以重載proc(http://wiki.tcl.tk/510說明如何)自動添加追蹤 – 2012-02-17 09:18:50

+0

嗨Donal: 很棒的建議,非常感謝。 – ilya1725 2012-02-21 21:26:12