其实,这个问题已经出现很长时间了,但是直到昨天问题才得到解决。 问题描述 用NS2运行无线仿真,然后运行动画程序nam,但是运行过程中出现“node
x is not
defined"这样的问题。开始还以为是不是nam出现了问题,经过几步找错和查错,调试终于找到了问题的根源。 问题解决步骤 首先运行ns
xxx.tcl,得到仿真的nam动画数据文件,我们假设为:test.nam。 然后用nam运行该数据文件,运行过程中出现节点未定义的错误,怀疑是nam程序的问题,决定对nam进行调试。 进入到nam的安装文件夹,修改Makefile,在选项中添加调试选项。CCOPT
= -g -Wall 重新编译生成nam:make clean; make; make install 开始使用GDB进行调试:gdb
nam 进入GDB之后输入命令:set args test.nam 然后在文件netmodel.cc的
NetModel::lookupNode()函数处设置断点:b
netmodel.cc:1570。 然后开始运行程序,输入r然后回车; 运行到断点处,程序停止运行。此时就可以查找出错的原因了,输入命令p
nodes_(存放节点链表的头指针),发现其值为空(=
0x0);于是断定问题的根源是在nam文件中存放节点的链表是空的,进而推知,问题处在test.nam文件而不是nam可执行文件。 打开nam文件查看,问题果然在此,因为在nam数据文件中并没有发现节点定义的语句(以n开头的语句)。 开始查找问题出现的原因,分析了一个成功运行的例子,得知无线节点必须使用setdest命令之后才会写到nam数据文件中(到现在原因还没有查明,期待您的评论)。 于是在仿真脚本文件中添加setdest命令,然后运行仿真,问题排除。 需要注意的一个问题是,在nam文件中节点在发数据之前必须已经存在,如果不存在就有会出错。
本人按上文方法测试,为节点加入 $ns at 0.0 "$node_($i) setdest $x $y
0.0" 后,果真不再报"ns2 node 0 is not defined ...",感谢高人,特拿来共享。
|