接触NS快一年了,但是还只能说是刚刚入了门,这一年里,从百思上确实学到了很多东西,NS的使用可能要告一段落了,有些心得体会跟大家分享一下,希望对还在入门的初学者有些帮助。主要是调试方面的,因为NS的代码太庞大了,因此出错后错误定位是非常重要的,有些可能不太对,还望各位高手指正。
1.1 使用GDB调试
在默认情况下不支持GDB调试,需要修改makefile.in:加上-g3选项
.cc.o:
@rm -f $@
$(CPP) -g3 -c $(CFLAGS) $(INCLUDES) -o $@ $*.cc
.c.o:
@rm -f $@
$(CC) -g3 -c $(CFLAGS) $(INCLUDES) -o $@ $*.c
调试步骤:
1. 转到ns-2.29目录下,cd ns-2.29-allinone/ns-2.29
2. gdb ns
3. 设置断点:b filename.cc:123
4. r /root/xxx.tcl
常用调试命令:
n: 单步不进入
s:单步进入
c:执行到下一断点
bt:查看堆栈调用
1.2 TCL调试
如果要支持TCL调试,在configure时加上—enable-debug选项,但是只要打开了enbale-debug选项,编译器检查更加严格,warning一般都会报错。
1.3 使用KDevelop调试NS
老版的NS与网络模拟上有讲如何使用KDevelop调试NS,感觉还不错,使用起来跟VC差不多,相比命令行的gdb方便很多。
1. 新建NS工程
NS安装好后,把ns-2.29目录下的makefile另存为makefile.am,然后选择Project|Generate Project File,找到ns-2.29目录,按OK就可以自动生成工程了。
2. 调试步骤
在控制台运行ns;
选择Debug|Start(other)|Attach to process,在对话框中找到NS进程,按OK将调试器和NS进程绑定;
选择Debug|Run;
设置断点;
在控制台输入命令:source /root/xxx.tcl。
Kdevelop中有输出窗口可以查看当前的调用栈,在watch选项卡中可以查看变量的值。
调试心得:
1. Segmentation Fault,段错误这类出错的原因多数都是使用了空指针,一般调试的时候只要正确设置断点,比较容易进行错误定位。
2. 程序无错跳出,一般是执行了abort()跳出来的,单步跟踪一下不难找到问题;
3. 程序无错但停不下来,一般是进入了死循环,这时可以选择Debug|Interrupt,让程序停下来,就可以找到在哪里死循环了。
4. 一般出现*_o*** cmd都是对应C++类的Command函数有错。在Command中各命令的排列先后顺序也有讲究,如果出现了*** lookup failed很有可能需要调整下命令的顺序,比如在使用TclObject *obj之前,一般需要判断obj是否存在,obj=TclObject::lookup(argv[2])==0,如果不需要用到obj的可以该命令放在obj的声明之前。