Yi's Blog

思绪来得快,去得也快

用 Xcode 调试 ns2

xcode-ns2-0

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 源码:

还好需要修改的内容并不是很多,参考这篇文章

把其中的 patch 保存到 ns-allinone-2.35 解压出来的文件夹,执行:

patch -p1< macos10.9.patch

然后就可以编译通过了。

创建一个空的 Xcode Project

打开 Xcode,创建一个新的 Project,模板选择 Command Line Tool 就好了:

xcode-ns2-1

选择一个名字,类型选择 C++:

xcode-ns2-1

删除系统为你添加的默认的 Target 和文件,新建一个 Target,选择 Target 的类型是 External Build System:

xcode-ns2-3

然后设定新 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 文件,并填入你需要的参数:

xcode-ns2-4

最后,把你想要调试的文件加入到 Project 中来,在你不理解的地方点上蓝色的小箭头,尽情地调试吧!

其他

当然,这样做完之后还有一点小问题 —— 源码中定义的类与函数不能通过 Command + 点击左键来跳转到定义。解决方法很简单:

  • 创建一个 Command Line Tool 的 Target,并且把你要跳转的文件设为这个 Target 需要编译的文件
  • 放心,你是不需要编译它的,只要有这样的一个 Target 存在,Xcode 就会生成跳转用的索引

后记

相比使用 GDB 调试,使用 Xcode 可以提高工作效率。以后再有需要调试的大型 C++ 程序,我也会首先选择 Xcode 阅读和调试。

PS:

  • 后续会再写一些和 ns2 有关的内容,有问题可以给我留言

- EOF -