ns2 是什么
ns2 是网络研究领域最流行的模拟器,提供了许多底层协议的模拟实现,是网络科研工作必备的工具之一。尽管最近出现的 NS3 提供了 Python 支持,更易上手,但是相比 NS3,ns2 有更多的资料和项目可供学习,且两者的主要代码都是 C++,分层方法相似,学会了使用 ns2,NS3 也可以触类旁通,所以相比 NS3 来说,学习 ns2 还是比较有性价比的选择。
为什么学习 ns2
ns2 是基于离散事件的模拟器(一个巨大的状态机),再加上需要支持各层网络协议的模拟,所以是一个大型的 C++ 项目。学习使用 ns2 一方面满足实验室工作需要,一方面也可以了解一个大型的 C++ 项目是如何组织和架构的。
使用 Xcode 调试 ns2
网上有很多关于如何调试 ns2 的材料,但多是教大家如何使用 GDB 来进行调试。作为一个 iOS 开发者,调试程序自然离不开我的“大锤”——Xcode,所以尝试了一下用 Xcode 调试 ns2,结果发现调试起来极爽。现把调试方法写出来,供大家参考(方法不局限于 ns2,其他的 C++ 项目也可以使用类似方法)。
编译 ns2
想要用 Xcode 调试 ns2 首先你需要一个可以编译通过的 ns2 源码:
- 下载 ns-allinone-2.35
- 尝试编译会发现无法编译通过
还好需要修改的内容并不是很多,参考这篇文章
把其中的 patch 保存到 ns-allinone-2.35 解压出来的文件夹,执行:
patch -p1< macos10.9.patch
然后就可以编译通过了。
创建一个空的 Xcode Project
打开 Xcode,创建一个新的 Project,模板选择 Command Line Tool 就好了:
选择一个名字,类型选择 C++:
删除系统为你添加的默认的 Target 和文件,新建一个 Target,选择 Target 的类型是 External Build System:
然后设定新 Target 目录为 ns-allinone-2.35 中 ns2.35 所在的文件夹,此时点击运行按钮,Xcode 提示编译成功。
调试 ns2
首先需要在 ns2 的 makefile.in 的编译 flag 中加入 -g 选项,确认编译出的可执行文件带有调试用的信息,比如我就是把第 55 行修改为:
CCOPT = -g @V_CCOPT@ -Wno-write-strings
当然,你也可以在其他的地方修改,保证有这个参数即可。然后,在命令行里执行
./configure & make
没有什么错误提示的话就是编译通过了。
接下来在 Edit Scheme -> Executable 中选择你生成的 ns2 文件,并填入你需要的参数:
最后,把你想要调试的文件加入到 Project 中来,在你不理解的地方点上蓝色的小箭头,尽情地调试吧!
其他
当然,这样做完之后还有一点小问题 —— 源码中定义的类与函数不能通过 Command + 点击左键来跳转到定义。解决方法很简单:
- 创建一个 Command Line Tool 的 Target,并且把你要跳转的文件设为这个 Target 需要编译的文件
- 放心,你是不需要编译它的,只要有这样的一个 Target 存在,Xcode 就会生成跳转用的索引
后记
相比使用 GDB 调试,使用 Xcode 可以提高工作效率。以后再有需要调试的大型 C++ 程序,我也会首先选择 Xcode 阅读和调试。
PS:
- 后续会再写一些和 ns2 有关的内容,有问题可以给我留言
- EOF -