其实,这个问题已经出现很长时间了,但是直到昨天问题才得到解决。
问题描述
用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 ...",感谢高人,特拿来共享。
联系客服