NS的调试 (piyajee)

接触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 的声明之前。

你可能感兴趣的:(调试)