ns3中調試程序------命令行、gdb和logging系統

1、在調試代碼時候,一直沒有弄明白NS_LOG中的各種函數是如何使用的,甚至現在運行程序只知道,./waf –run,至於輸出調試信息,現在真的是沒有弄明白,不利於代碼的理解和調試。

2、通過命令行,改變實驗變量,觀察實驗結果,./waf --run "sb" --command-template="%s --help"
會出現程序參數和一般參數
比如修改distance(default=50),./waf --run "sb" --command-template="%s --distance=200",會明顯實驗結果在distance=200時,收發數據包爲0,distance距離導致收發雙方不能正常通信。
這種通過命令行的方法,只會改變一次運行結果,不會改變文件中的值,下次運行時,distance仍然=50,對於觀察實驗結果來說,很方便,尤其是把每次改變結果值,寫成腳本,運行很方便
3、gdb調試,個人認爲比較笨拙,不過在eclipse沒安裝成功,這也是一個小調試的方法。
./waf --run "sb" --command-template="gdb %s",進入到gdb調試環境中,l,break,r,finish,next,進行調試。

4、NS3中的logging系統,功能也很強大,只是現在使用很少,記錄各模塊中的輸出信息,對調試的執行有幫助。
在程序中”wifi-example-sim.cc”發現,使用了”NS_LOG_COMPONENT_DEFINE”和”NS_LOG_INFO”以及”NS_LOG_ERROR”這3種形式的函數;
比如,我想在運行程序”wifi-example-sim.cc”時,輸出NS_LOG_INFO函數中的信息,首先找到NS_LOG_COMPONENT_DEFINE("WiFiDistanceExperiment"),之後通過命令行
$ export NS_LOG=WiFiDistanceExperiment=info
$ ./waf --run "sb"
觀察程序運行情況;
因爲該程序,”NS_LOG_ERROR”未執行到,所以,沒有信息輸出。
5、
$ export NS_LOG=WiFiDistanceExperiment=all:WiFiDistanceApps=all
$ ./waf --run "sb"
可以看到”wifi-example-sim.cc”和”wifi-example-apps.cc”中的NS_LOG信息,便於理解程序運行。
分析程序,從main函數運行,“Create traffic source & sink”之後,創建對象,調用WiFiDistanceApps::Sender和WiFiDistanceApps::Receiver(使用了NS_LOG_FUNCTION_NOARGS,輸出函數的名字,這應該只在靜態函數中使用;大多數成員函數應該使用NS_LOG_FUNCTION()),之後開始Simulator::Run()

6、如果顯示函數前綴,$ export 'NS_LOG=WiFiDistanceExperiment=all|prefix_func|prefix_time:WiFiDistanceApps=all|prefix_func|prefix_time'
$ ./waf --run "sb"

可以得到很詳細的函數調用,以及函數調用的時間,有時候也是一種負擔,因爲太詳細,終端不容易觀察,可以輸出到文本文件中查看$ ./waf --run "sb" >&sb.txt可以通過$ gedit sb.txt查看輸出信息。
7、爲了方便,經常定義

bool verbose=false;
WifiHelper wifi;
if(verbose)
{
wifi.EnableLogComponents();
}//turn on all wifi logging

8、同樣也可以定義:

bool tracing=false;//turn on ascii and pcap tracing;
if(tracing == true)
{
AsciiTraceHelper ascii;
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default();
wifiPhy.EnableAsciiAll(ascii.CreateFileStream("wifi-simple-adhoc-grid.tr"));
wifiPhy.EnablePcap("wifi-simple-adhoc-grid",devices);
NetdeviceContainer devices = wifi.Install(wifiPhy,wifiMac,c);
}
export NS_LOG=UdpEchoClientApplication=level_all
export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func'
export 'NS_LOG=*=level_all|prefix_func|prefix_time'
unset NS_LOG//關閉所有的NS-LOG
發佈了47 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章