调用类$ cls时出现TCL和NS2"错误:$ args:$ args"

时间:2016-09-05 07:48:20

标签: tcl ns2

我已经在线查看但是我无法调试我的问题。 我正在运行一个tcl文件,它将产生以下错误,我已经硬编码值,它仍然无法正常工作。为什么它不喜欢nametrace线?

set val(rp)     AODV                       ;# routing protocol
set opt(x)      3500
set opt(y)      2000


set ns_     [new Simulator]
set tracefd     [open map.tr w]
$ns_ trace-all $tracefd

set namf [open map.nam w]
$ns_ namtrace-allwireless $namf opt(x) opt(y) 

运行上面的代码会产生以下错误

(_o3 cmd line 1)
    invoked from within
"_o3 cmd namtrace-allwireless file4 3500 2000"
    invoked from within
"catch "$self cmd $args" ret"
    invoked from within
"if [catch "$self cmd $args" ret] {
set cls [$self info class]
global errorInfo
set savedInfo $errorInfo
error "error when calling class $cls: $args" $..."
    (procedure "_o3" line 2)
    (SplitObject unknown line 2)
    invoked from within
"$ns_ namtrace-allwireless $namf $opt(x) $opt(y)"
    (file "map.tcl" line 45)

有没有人对错误被抛出的原因以及我可以采取哪些步骤进行调试有任何想法。

1 个答案:

答案 0 :(得分:0)

您的报告整齐地省略了实际的错误消息,只是给出了堆栈跟踪。不幸的是,对于oTcl(NS2使用的对象系统),堆栈跟踪不是很有用;它只是告诉我们问题发生在namtrace-allwireless类的Simulator方法的实现中,或者可能是在尝试调度到实现时发生的。很难说哪个。 您需要修复错误报告。

从C和C ++报告错误

如果您已经用C或C ++编写了该方法的实现,那么最可能的问题是您没有将Tcl解释器结果设置为返回的特定路径上的错误消息{ {1}}在这种情况下。标准的Tcl API辅助函数在检测到错误时都会设置它们(虽然在某些情况下只有通过TCL_ERROR标志询问;这适用于变量访问器)但是因为那里有自己生成的错误#39 ;在某些您已检测到的情况下,您需要通过致电TCL_LEAVE_ERR_MSGTcl_SetResultTcl_SetObjResult“手动”执行此操作。

从Tcl

报告错误

如果您已经在Tcl中编写了该方法的实现,问题可能就是您使用默认的空结果完成了此操作:

Tcl_AppendResult

在最后添加错误消息:

return -code error

或者使用return -code error "something bad happened" 命令强制您提供消息(并且不要使用空字符串)。

您问题的实际原因未知。我怀疑它要么在错误的堆栈上下文中解析变量(并且你没有要求代码在发生这种情况时为你生成错误),或者它是& #39;一旦修复错误报告就会很明显。纠正错误非常重要。