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中雙擊它會打開序列圖工具,並在窗口底部顯示事件日志選項卡。
筆記
結果日志文件可能很大,因此僅在確實需要時才啟用此功能。
下圖是使用“_序列圖”_工具創建的,顯示了如何在網絡中的不同節點之間路由消息。在這種情況下,圖表非常簡單,但是當您擁有復雜的模型時,順序圖對於調試,探索或記錄模型的行為非常有價值。
Omnet++學習資源太少,個人翻譯不易。您的每一分錢都會給后來的開發者提供幫助!感謝支持。