我還不以為意,以為是scenario太複雜,所以要跑很久...。
直到那天我放著模擬跑,人出去看電影,回來發現竟然還在跑(驚!),
我才覺得不對勁(也太遲鈍了吧.....囧)
反覆檢查後發現,程式在DSDV內會進入無窮迴圈,導致怎麼跑都跑不完。
於是就把dsdv.cc打開來修改一下:
ns-2.x/dsdv/dsdv.cc
在 void DSDV_Agent::processUpdate (Packet * p) function內,
約791行附近,有個 if 判斷這麼寫著:
// see if we can send off any packets we've got queued
if (rte.q && rte.metric != BIG)
{
Packet *queued_p;
while ((queued_p = rte.q->deque()))
// XXX possible loop here
// while ((queued_p = rte.q->deque()))
// Only retry once to avoid looping
// for (int jj = 0; jj <>length(); jj++){
// queued_p = rte.q->deque();
recv(queued_p, 0); // give the packets to ourselves to forward
// }
delete rte.q;
rte.q = 0;
table_->AddEntry(rte); // record the now zero'd queue
}
猜測這邊就是infinite loop形成的原因。
本來應該是要將queue裡面積存的packet取出然後送出,
可是會造成while永遠為true,形成無窮迴圈,bug就產生啦。
將它改成以下,應該就沒問題了
// see if we can send off any packets we've got queued
if (rte.q && rte.metric != BIG)
{
Packet *queued_p;
printf("DEGUB => in DSDV_Agent::processUpdate:795, rte.q->length()= %d\n",rte.q->length() );
//printf is only for debug :P
Packet** temp_array = new Packet*[rte.q->length()] ;
for(int i=0; i< rte.q->length(); i++){
temp_array[i] = rte.q->deque();
}
for(int i=0; i< rte.q->length(); i++){
recv(temp_array[i], 0);
}
delete rte.q;
rte.q = 0;
table_->AddEntry(rte); // record the now zero'd queue
}
//--
萬分感謝千益學弟,以及gdb的幫忙^_________^
至於blog中顯示程式碼區塊的方法,請參考:p
http://hdj-berkeley.blogspot.com/2008/06/blog.html
4 則留言:
你好
請問有測試成功嗎?
我自己測試會出現Segmentation fault (core dumped)
謝謝
我跑是沒問題耶,會不會是其他的原因造成segmentation fault?
可以用gdb debug看看是哪裡出問題。
不過另一個可能原因是我的DSDV是舊版的,
因為我的程式需要,所以我沒有用ns2 2.34的DSDV,你先確定你的DSDV會有loop問題再參考我的文章修改看看囉 :)
請問您有電子信箱嗎 想請教您一些NS2的問題
阿,sorry 我太晚看到這訊息Orz
老實說我有點久沒有碰NS2了,
建議你有問題可以上ns2 mailing list上去找看看,如果沒有人問過可以寫信去詢問!
加油加油 :)
http://www.isi.edu/nsnam/ns/ns-lists.html
張貼留言