2012-02-13 4 views
1

Tcl_CreateObjTraceの使用例はありますか?これは、TclLibを使用してCコードにTcl呼び出しのトレースを追加する手順です。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_ALLOW_INLINE_COMPILATIONTcl_CreateObjTraceコールのフラグパラメータは、(特に、多くの共通のコアコマンドは、そのフラグが設定された正常としてコンパイルバイトコードである)トレースの最も侵入レベルが無効になる設定、言及しています。つまり、Tclレベルからtrace add executionまでこのメカニズムにフックするのが実質的に簡単です。あなたが興味を持っているそれぞれのコマンドにenterのトレースを設定する(申し訳ありませんが、それらをリストアップしなければなりません)。 (これは、traceの内部でコードができない方法で多くのコストを削減できるためです。これはかなり難しく、traceコマンドの実装を扱うことが嫌な理由の1つです)。

+0

はい、TCL_ALLOW_INLINE_COMPILATIONいくつかの時間を働いた。 :(これは、Tcl呼び出しでビルドされたものをたくさん削除しましたが、すべてではありません。 [トレース追加の実行]を使用することは可能でしょうか(http://www.tcl.tk/man/tcl8.5/TclCmd/trace.htm #M9)を使用してすべてのユーザー手順をトレースするか、手動で登録する必要がありますか? – ilya1725

+0

@ilyaそれぞれを登録する必要がありますが、これは難しいことではありません。そのリストを繰り返してトレースを追加するか、proc(http://wiki.tcl.tk/510に記載されています)をオーバーロードして自動的にトレースを追加することができます。 –

+0

こんにちはDonal: 素晴らしいアドバイスありがとうございました。 – ilya1725