0

当使用 Tcl C++ API Tcl_Eval时,如果它返回TCL_ERROR,则可以从Tcl_GetStringResult(interp). 但是,当执行一堆 tcl 脚本时,错误消息并没有指出脚本失败的那一行。

例如:

can't find package foobar
    while executing
"package require foobar"
    (file "./test.tn" line 5)

Tcl_GetStringResult(interp)不提供此信息:(file "./test.tn" line 5)。有没有办法像在 tcl 解释器中一样打印出调用堆栈,以便我知道脚本在哪一行失败?

4

2 回答 2

1

我使用以下代码拉回并报告可从解释器获得的错误信息。

Tcl_Obj *top_interpInfoName ;
Tcl_Obj *top_interpInfo ;

top_interpInfoName = Tcl_NewStringObj("errorInfo", -1) ;
    Tcl_IncrRefCount(top_interpInfoName) ;
    top_interpInfo =  Tcl_ObjGetVar2(tcl_interp,
                                     top_interpInfoName,
                                     NULL,
                                     TCL_LEAVE_ERR_MSG) ;
    Tcl_IncrRefCount(top_interpInfo) ;
    ERR_REP2("ERROR: %s", Tcl_GetString(top_interpInfo)) ;
    Tcl_DecrRefCount(top_interpInfoName) ;
    Tcl_DecrRefCount(top_interpInfo) ;

ERR_REP2 是我的错误报告宏,你需要用你自己的替换它。

于 2013-02-04T11:22:51.347 回答
1

您正在查找的信息,即错误信息(即堆栈跟踪),位于全局errorInfo变量中。该信息可以通过Tcl_GetVar其相关功能或其相关功能之一来检索。最好的选择之一是Tcl_GetVar2Ex高效的(名称是缓慢发展的 API 的产物):

Tcl_Obj *infoObj = Tcl_GetVar2Ex(interp, "errorInfo", NULL, TCL_GLOBAL_ONLY);

然后,您使用Tcl_GetString将人类可读的部分提取为char *(视为const)。

于 2013-02-04T12:12:54.287 回答