1. 程式人生 > >ns3中除錯程式------命令列、gdb和logging系統

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