2008年6月23日 星期一

NS2---Segment fault

呼...好一陣子沒寫Blog了,這陣子都在忙著跑模擬.之前在跑模擬,會不時的發生Segment fault這種錯誤,後來利用gdb或是valgrind來debug,會發現程式都停在我們沒有動到的地方,例如: getcid, getBasic...等等地方.這時不要慌張!!(但是我們被這種問題困擾了好久 囧),若是利用gdb來debug的人,當程式遇到錯誤停下後,可以下"bt"的指令,來找出是誰呼叫到這個function,使其產生錯誤~~;在從發生錯誤的地方往回追朔後,會發現原來是tcl的timer沒設好!!
多次的segment fault中發現,要是你拓普點多的時候,使用NIST預設的timer對於node來說是不夠用的,我們推測由於timer會倒數,當點變多的時候,某個node的timer倒數結束前BS沒能即時去抓相對應的資料,後來node的timer倒數結束後,BS才去抓資料,可是此時node已經因timer倒數結束exprice,這樣BS當然就抓不到東西產生segment fault嚕!!因此當你的拓普node數量很多的時候,在run NS2時又產生segment fault,且錯誤是發生在你沒修到程式的地方,那就可以考慮在tcl 裡面增加某些timer的數值!!!這樣應該可以解決你segment fault的問題 ^^ (至少我是這樣解決了不少segment fault~我有把t6,t17,t44這幾個數值加大!)

End~

2008年6月15日 星期日

建立scripts

在跑模擬的時候,有時都要重覆一些執行過的指令~每次都在輸入許多相同的指令,令人覺得既浪費時間又麻煩~這時最好的方法就是建立一個scripts. 以下就直接用範例說明唄!!

假如每次都重複執行:
mkdir test
rm shagin45/BS.log
ns hnss > l
那就可以把上面這些指令建成一個scripts,步驟如下:

Step 1.
建立任一文字檔. "vim shagin45"
Step 2.
將上述的指令鍵入剛剛所建立的文字檔中,輸入後存檔離開.
Step 3.
改變剛剛的文字檔mod. "chmod 755 shagin45"
Step 4.
以後只要執行shagin45,就會執行其內所寫的指令 "./shagin45"

End~~

2008年6月11日 星期三

NS2---Scheduler: Event UID not valid!

由於在我的論文中會要設計SS滿足某種條件後,啟動send_scan_request(),但是若直接指定SS啟動scanning的動作,那就有非常大的可能產生: "Scheduler: Event UID not valid!",後來上網查了一下,發現是因為有一個timer物件,還沒有被expire,而我又再一次呼叫它的start function!!
知道原因後,我查看看send_scan_request()中有沒有產生新的timer,發現到原來它會產生一個新的t44timer (也就是因為這原因所以發生錯誤), 因此我再自行啟動send_scan_request()前多加了if判斷:
if (t44timer_ && t44timer_->busy()!=0)
t44timer_->stop();

如此一來就可以解決問題了~^^b

End~

2008年6月9日 星期一

即時增加swap

由於NS2在跑模擬時,總是會遇到一些難以理解的錯誤...所以黃老師幫我們跟江清泉老師約在今天碰個面,希望他能為我們解開疑惑或是給個方向,在一個小時多的討論中,雖然沒有得到真正很明確的解決辦法~但是總算知道問題大概出在哪邊,目前最有可能發生錯誤的原因,是Memory被我們衝爆了(囧),所以江老師提供我們一個方法讓風哥可以即時的增加swap,以下為即時增加swap的方法:
Step1. dd if=/dev/zero of=/tmp/swap bs=1G count=20 (本來才2G的swap,打算多增加20G的swap)

Step2. mkswap /tmp/swap

Step3. swapon /tmp/swap

Step4. 若要在下次開機時能自動執行,則須在/etc/fstab加入下面那一行:
/tmp/swap swap swap defaults 0 0

革命尚未成功~同志仍須努力

End~~

2008年6月6日 星期五

NS2---BS佈建數量限制

當我在寫Tcl的時候,每次最多就只能佈建5個BS,但是我最多要佈建14個BS (囧a), 後來我用gdb來debug,發現每次在建到第六個BS時, 其MAC在 getPhy ()->setFrequency (tmp);的時候都會出錯, 後來我用display看了一下tmp~沒想到居然等於零~~~~,突然想到學長之前mac802_16.cc有一些修改的地方,我就開來比對一下,發現原本NIST預設static const int nbFreq = 5; 學長把它增加到static const int nbFreq = 45; 當然相對的學長也把frequencies的數量增加:
static const double frequencies[] = {3.367e+9,3.374e+9,3.381e+9,3.388e+9,3.395e+9,3.402e+9,3.409e+9,3.416e+9,3.423e+9,3.43e+9,3.437e+9,3.444e+9,3.451e+9,3.458e+9,3.465e+9,3.472e+9,3.479e+9, 3.486e+9, 3.493e+9, 3.5e+9, 3.507e+9, 535e+9,3.542e+9,3.549e+9,3.556e+9,3.563e+9,3.57e+9,3.577e+9,3.584e+9,3.591e+9,3.598e+9,3.605e+9,3.612e+9,3.619e+9,3.626e+9,3.633e+9,3.64e+9,3.647e+9,3.654e+9,3.661e+9,3.668e+9,3.675e+9 };

後來我也把數量增加後,在Tcl就可以成功佈建5個BS以上嚕 ^^,所以要是你需要建5個BS以上,記得要修改nbFreq 與 frequencies[].

End~

2008年6月4日 星期三

NS2---Debug tool

在撰寫NS2的過程中,compiler一定會遇到大大小小的錯誤,最令我厭惡的不外乎就是Segmentation fault (core dumped) 與 Floating point exceptionns, 特別是Segmentation fault 這種錯誤,要是不用tool根本很難找出它錯誤的地方. 為了解決這種錯誤, 就要請 "Valgrind" 出馬嚕(之前有試過gdb但是他回報的錯誤訊息太模糊了囧a,有時根本找不出錯誤真正的地方) !! 但是有個缺點~就是利用Valgrind來debug時會很花時間, 事事無完美嚕~只要找得出bug,就是好tool!!

Debug 指令: valgrind --tool=memcheck --leak-check=full --db-attach=yes ns ***.tcl > *** (valgrind 還有其他的option可以參考下列網址).

reference :
http://kaku26.blogspot.com/2008/06/blog-post_2013.html
http://citynight.blogbus.com/logs/11648949.html

End~