2011年2月18日 星期五

基本避免Memory Leak的技巧

很多程式初學者比較沒有在注意一些Memory處理上的問題。其實只要平時稍微注意一下,就可以避免掉很多問題,而且也可以讓你的程式更好以及更穩定。

首先,是指標變數內容的問題。通常各位在使用指標時,可能習慣不給予初始值。其實這會造成一些問題。所以建議大家宣告指標變數時一律給予初值。若無法在宣告的同時一併配置記憶體,那麼請給予NULL作為初值。例如:

TList *myList = NULL ;

另外,許多在delete後,大家可能也就不再理會該指標的內容了。其實,這也是會造成一些麻煩。因為記憶體被delete可能只是系統作一個記號在記憶配置表中,表示該記憶體是free的。原來的記憶體內還是有原先的內容。但是你的程式一個不注意,又去把原來的指標拿起來用。如果馬上就出錯的話,這樣還好。偏偏因為原來的內容都還在,所以這個錯誤會延遲產生影響。這種類型的Bug特別難抓!因為,你根本找不到引發問題的所在,如果你有個地方一直發生Access Violation,可是該地方的程式碼你已經check過十幾次了,還是找不問題,那很可能你就是遇到這樣的問題。以前在寫一些程式時,我就曾經為了這樣的Bug,弄了三天。可見其傷害有多大。

所以,當delete某指標後,其務必將其內容設為NULL。一方面是使用NULL指標,一定是馬上出錯。所以你的Bug一下就會抓到。另外一個
理由是如果你不小心重複delete同一個物件時,一樣會發生延遲影響的錯誤。


轉貼自: http://blog.xuite.net/huenlil/note/5290923

2011年2月10日 星期四

LACP timeout value problem? 改成short timeout為什麼反而是收到對方的LACPDU的timeout變短?

在LACP中timeout value只有兩種mode可以選,long以及short。long是30秒而short則是1秒。timeout value影響的是不同台間在維持LACP link時多久會去發一個packet去「確認」這條連線還是不是存在,如果不存在則在3倍timeout value後把這個port移出trunk group,而確認連線是否活著的packet通稱為LACPDU。

而目前有個問題意思是說當兩台DUT對接,當A台的timeout 設成1 sec而另外一台B維持default 30sec,去抓封包會發現B台會每隔1 sec發一次LACPDUPACKET
反而A台還是原本的30sec去發LACPDU packet,好像有點怪怪的!?

經過查證後我們得到spec是寫說送LACPDU PACKETtimeout 時間是參考「對方的timeout 時間,也意思是說當對方timeout設為1秒時候我們才會每1秒去發packet;反之則不會。

可以翻閱802.3ad-2000 p.133頁關於LACPTx state machine的描述:
LACP Periodic Tx Machine[1]
可以看到標紅色的部份,當我們要送LACPDU的時候會根據Partnertimeout value
/* specactor代表的是自己;partner代表的是另外一台 */

另外,如果接DUT去接host,改了TIMEOUT1sec後也是30sec才會收到LACPDU也是因為這個緣故。(partnertimeout value default都是30sec,當收到對方LACPDU時候跟現在timeout value不同才會去update)

Reference:
[1] IEEE 802.3ad-2000