OMnet++初学者教程 第二节运行仿真
2.1启动仿真程序
完成上述步骤后,可以通过选择%omnetpp.ini文档(在编辑器区域或_Project Explorer中_)并按“_运行”_按钮来启动仿真。
IDE将自动构建您的项目。如果存在编译错误,则需要纠正这些错误,直到获得无错误的编译和链接。您可以通过 从菜单中选择_Project-> Build All_或_按Ctrl + B_来手动触发构建。
笔记
如果你想建立在命令行中的可执行模拟,创建一个_Makefile中_使用opp_makemake
命令,然后输入make
要生成项目。它将产生一个可执行文件,可以通过输入来运行./tictoc
。
2.2运行模拟
成功构建并启动仿真后,您应该会看到一个新的GUI窗口,类似于下面的截图。该窗口属于_Qtenv_,它是OMNeT ++仿真运行时GUI。您还应该可以再主体区域中看到以图形方式显示的包含_tic_和_toc_的网络。
按下工具栏上的“_RUN”_按钮开始仿真。您应该看到的是_tic_和_toc_正在彼此交换消息。
主窗口工具栏显示当前模拟时间。这是虚拟时间,与程序执行的实际(或挂钟)时间无关。实际上,在一秒钟内可以仿真多少秒,在很大程度上取决于硬件的速度,甚至更多地取决于仿真模型本身的性质和复杂性。请注意,节点处理消息所需的模拟时间为零。在此模型中消耗仿真时间的是连接的传播延迟。
您可以放慢动画的播放速度,也可以使用图形窗口顶部的滑块来加快动画的播放速度。您可以通过以下方式停止仿真:按下F8(相当于工具栏上的“停止”按钮),单步执行(F4),使用(F5)动画或不使用(F6)动画运行它。F7(快速模式)完全关闭跟踪功能,以实现最大速度。注意主窗口状态栏上的事件/秒和辛秒/秒标尺(仅当模拟以快速或快速模式运行时才可见)。
练习
通过多次运行仿真来探索GUI。尝试 运行,运行直到,_重建网络_以及其他功能。您可以通过单击其_关闭_图标或选择_File-> Exit退出_模拟程序。
2.3调试
仿真只是一个C ++程序,因此,在开发过程中通常需要对其进行调试。在本节中,我们将介绍调试的基础知识,以帮助您完成这项至关重要的任务。
单击 IDE主工具栏上的“_调试Debug”按钮,可以在调试模式下启动仿真。
这将导致仿真程序在调试器(通常是_gdb)下启动。IDE还将切换到“Debug视图”,即将其各种窗口和视图重新排列为更适合调试的布局。您可以使用工具栏上的“_终止 STOP”_按钮(红色方框)结束调试会话 。
运行时错误Runtime errors
调试一般用于找出运行时异常。让我们试一下如何调试。
首先,故意在程序中引入错误。在 txc1.cc中,复制内的send()
行 handleMessage()
,以使代码如下所示:
void Txc1::handleMessage(cMessage *msg)
{
//...
send(msg, "out"); // send out the message
send(msg, "out"); // 这会造成错误
}
当您在一般模式下启动仿真(_“Run”_按钮)并尝试运行它时,您将收到以下的错误消息:
现在,在“_Debug”_模式下运行仿真。由于debug-on-errors
默认情况下启用了一个选项,因此在调试器中仿真程序将停止。您可以通过在“_调试”_视图中检查堆栈定位(嵌套函数的列表)错误:
您可以看到是OMNeT ++的breakIntoDebuggerIfRequested()
方法激活了调试器。从那时起,您需要搜索一个看起来很熟悉的函数,即属于模型一部分的函数。在我们的示例中,那就是“ Txc1::handleMessage() at txc1.cc:54”行。选择该行将在编辑器区域中显示对应的源代码,并允许您在“_变量”_视图中检查变量的值。此信息将帮助您确定错误原因并进行修复。
崩溃
跟踪崩溃(即段错误)是相似的,我们也尝试一下。撤消先前的源代码编辑(删除重复的send()
行),并引入另一个错误。假设我们忘记了在发送消息之前创建消息,并在其中更改了以下几行initialize()
cMessage *msg = new cMessage("tictocMsg");
send(msg, "out");
简单地变成
cMessage *msg ;// 没有进行初始化操作
send(msg, "out");
运行仿真的时候,它将会程序崩溃。(您将收到类似于“Simulation terminated with exit code: 139”的错误消息)。如果再次启动仿真,这次是在“_调试”_模式下,崩溃将使您进入调试器。到达该位置后,您将能够在“_调试”_视图中找到错误并检查变量,这将帮助您识别和修复错误。
断点Breakpoints
您还可以将断点手动放置到代码中。断点将停止执行,并允许您检查变量,逐行执行代码或继续执行(直到下一个断点为止)。
可以通过在编辑器中双击左装订线,或从上下文菜单中选择“切换断点”,将断点放置在源代码中的特定行。可以在“_断点”_视图中检查活动(和非活动)断点的列表。
练习!
尝试断点!在handleMessage()
方法函数的开头放置一个断点,然后运行模拟。使用工具栏上的适当按钮可以单步执行,继续执行直到下一次击中断点,依此类推。
调试下一个事件
如果您进行了前面的练习,您一定已经注意到,在Txc1简单模块中的每个事件处都触发了断点。在现实生活中,错误经常发生在该模块中的357事件,因此理想情况下就是您要开始调试的时候。仅要单击356次以_恢复_错误的位置,并不是很方便。一种可能的解决方案是向断点添加_条件_或_忽略_计数(请参见其上下文菜单中的“断点属性”)。但是,有一种可能更方便的解决方案。
在_Qtenv中_,使用_“Run Until_ ”来调试事件。然后,从菜单中选择_Simulation-> Debug Next Event_。这将handleMessage()
在下一个事件开始时在调试器中触发一个断点,您可以开始调试该事件。
2.4调试/运行对话框
让我们再次启动仿真。
使用 IDE工具栏上的“_Run”_或“Debug”按钮启动仿真程序时,与启动相关联的设置将保存在_启动配置中。可以在“运行/调试配置”对话框中查看启动配置,例如,通过单击“运行”(调试)工具栏按钮旁边的小_向下_箭头 以打开菜单,然后在其中选择“运行(调试)配置...”,可以打开 启动配置。在这个菜单中,您还可以单击启动配置的名称(例如_tictoc),同时按住Ctrl键以打开具有相应配置的对话框。
该对话框允许您激活启动时的各种设置。
2.5在序列图上可视化
OMNeT ++仿真内核可以将仿真过程中的消息交换记录到_事件日志文件中_。要启用记录事件日志,请在启动配置对话框中选中“ Record eventlog”复选框。或者,您可以在omnetpp.ini中指定_record-eventlog = true_,甚至可以在启动后使用Qtenv图形运行时环境中的_Record_按钮,
以后可以使用IDE中的“_序列图”_工具分析日志文件。该results
项目文件夹目录中包含的.elog
文件。在OMNeT ++ IDE中双击它会打开序列图工具,并在窗口底部显示事件日志选项卡。
笔记
结果日志文件可能很大,因此仅在确实需要时才启用此功能。
下图是使用“_序列图”_工具创建的,显示了如何在网络中的不同节点之间路由消息。在这种情况下,图表非常简单,但是当您拥有复杂的模型时,顺序图对于调试,探索或记录模型的行为非常有价值。