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退出_模拟程序。
仿真只是⼀个C ++程序,因此,在开发过程中通常需要对其进⾏调试。在本节中,我们将介绍调试的基础知识,以帮助您完成这项⾄关重要的任务。
单击 IDE主⼯具栏上的“_调试Debug”按钮,可以在调试模式下启动仿真。
这将导致仿真程序在调试器(通常是_gdb)下启动。IDE还将切换到“Debug视图”,即将其各种窗⼝和视图重新排列为更适合调试的布局。您可以使⽤⼯具栏上的“_终⽌ STOP”_按钮(红⾊⽅框)结束调试会话。
运⾏时错误Runtime errors
调试⼀般⽤于出运⾏时异常。让我们试⼀下如何调试。
⾸先,故意在程序中引⼊错误。在,复制内的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() :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中双击它会打开序列图⼯具,并在窗⼝底部显⽰事件⽇志选项卡。
笔记
结果⽇志⽂件可能很⼤,因此仅在确实需要时才启⽤此功能。
下图是使⽤“_序列图”_⼯具创建的,显⽰了如何在⽹络中的不同节点之间路由消息。在这种情况下,图表⾮常简单,但是当您拥有复杂的模型时,顺序图对于调试,探索或记录模型的⾏为⾮常有价值。
Omnet++学习资源太少,个⼈翻译不易。您的每⼀分钱都会给后来的开发者提供帮助!感谢⽀持。