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~

5 則留言:

匿名 提到...

想請問一下要怎麼樣用ns2取得接收到的訊號強度,算RSSI??
我看了你寫的http://shagin45.blogspot.com/2008/04/ssscheduler11-sendmshoreq.html
提到利用getStatWatch()取得訊號強度在利用average()算出rssi
實際要怎麼寫,還是沒看懂,可不可以詳述教我一下~謝謝

Vito 提到...

取RSSI的方式有兩種case---
Case1. 在SS中取RSSI:
rssi = mac_->getPeerNode_head()->getStatWatch()->average();
RSSI = (u_char)((rssi+103.75)/0.25);

Case2. 在BS中取RSSI:
RSSI_SS = 10*log10(p->txinfo_.RxPr*1e3); //p為BS從SS所收到的packet

因此會根據BS或SS,而用不同的方式取出RSSI.

你可以參考ssscheduler.cc內的用法.

匿名 提到...

謝謝你的解答~~
我有個的兩個疑問~
為什麼SS跟BS取RSSI的方法會不同,不是都一樣接收到別人的封包後,做計算的

Vito 提到...

我不確定為什麼耶,可能他更底層寫code的方式吧~我是沒試過利在SS中利用Case2的方式取RSSI,你可以試試看^^

匿名 提到...

Could you tell me the new timer that you used for t6, t17 and t44?
The change that you made gonna affect QoS?