- 論壇徽章:
- 0
|
本帖最后由 it-rocket 于 2010-06-01 11:28 編輯
既然你的沒(méi)問(wèn)題,那就是"RPC機(jī)制"有問(wèn)題.總之會(huì)是linux的問(wèn)題.
除非你門(mén)自己改動(dòng)過(guò)OS
smalloc 發(fā)表于 2010-05-31 14:33 ![]()
smalloc的分析真的是一針見(jiàn)血!
代碼沒(méi)有辦法從公司考出來(lái),請(qǐng)諒解。
今天在公司調(diào)這個(gè)內(nèi)存耗盡問(wèn)題的時(shí)候,我將除了具備發(fā)送功能的main線程以外的所有線程操作全部屏蔽掉,只用RPC下發(fā)送數(shù)據(jù)的函數(shù)來(lái)連續(xù)發(fā)送模擬數(shù)據(jù),結(jié)果發(fā)覺(jué)隨著數(shù)據(jù)的不斷網(wǎng)絡(luò)發(fā)送,該RPC服務(wù)器進(jìn)程所占內(nèi)存仍然不斷地增加,所以我斷定問(wèn)題就出在這里。
由于這個(gè)RPC發(fā)送函數(shù)是從VTI給的小demo例子來(lái)的,所以我也沒(méi)有懷疑過(guò)它會(huì)出問(wèn)題,只不過(guò)在上面修改成我的數(shù)據(jù)而已。在該發(fā)送函數(shù)內(nèi)中,有如下定義:
{
static Device_ReadResp result;
....
xdr_free(xdrproc_t)xdr_Device_ReadResp,(char*)&result); //據(jù)說(shuō)是釋放上一次分配的內(nèi)存等資源,該發(fā)送函數(shù)中無(wú)free樣的函數(shù)
....
result.data.data_val = (char *)malloc(sizeof(char*)num_bytes); // num_bytes為我從windows客戶端指定的字節(jié)數(shù),為16386Byte。
...
//將我要發(fā)送的數(shù)據(jù)填入result.data.data_val中
....
return &result;
}
當(dāng)上面的函數(shù)體執(zhí)行完畢后,就將數(shù)據(jù)發(fā)送出去了。
在該發(fā)送函數(shù)中查看前后兩次的地址時(shí),該指針的地址值都是不斷地上升,前后兩次顯示的地址值差為16392Byte。
我嘗試著將其xdr_free注釋掉,換成我的free(result.data.data_val),但是該程序一啟動(dòng)開(kāi)始傳數(shù),就報(bào)段錯(cuò)誤。而且對(duì)那個(gè)result的static變量,我不知道該如何處理才好。
請(qǐng)各位多指點(diǎn)。非常感謝。 |
|