上周六也沒啥事,就去公司了把這周剩下的工作結(jié)束掉,總結(jié)下。正好測試的同學(xué)在那,突然跟我說使用GM添加物品時(shí)沒反應(yīng)了,估計(jì)是程序掛了,然后看了下工作進(jìn)程,的確掛了。打開了core文件看了下調(diào)用棧,是掛在了一個(gè)uint32_t的成員變量,該表達(dá)式是一個(gè)移位操作,不大可能會掛在這兒,而且開發(fā)了大半年的項(xiàng)目平時(shí)也測試沒啥問題,就今天掛在了這里,沒道理。然后看了下這個(gè)對象的一些內(nèi)容很奇怪,都是1~9的數(shù)字串,然后也訪問不了。
估計(jì)該地址的內(nèi)容被非法修改了【該內(nèi)容是個(gè)指針數(shù)組】。首先,這個(gè)對象是單例:
CObj * GetInstance()
{
????? static CObj m_Obj;
????? return &m_Obj;
}
然后因?yàn)槭蔷植縮tatic成員,只有在首次調(diào)用的時(shí)候被初始化,分配在靜態(tài)存儲區(qū),那么到底是哪個(gè)代碼修改了它?
由于問題不大好復(fù)現(xiàn),因?yàn)槌绦蜻\(yùn)行著一段時(shí)間才有可能出現(xiàn)這種錯誤,而且首次出現(xiàn)這種問題,只能watch這個(gè)變量?;蛘適protect這個(gè)單例對象的指針數(shù)組成員所占的內(nèi)存,當(dāng)被修改時(shí)回調(diào)某個(gè)函數(shù)打印出調(diào)用函數(shù)棧來分析,目前只能是這樣了。
2016-04-14
今天又想辦法找那個(gè)難復(fù)現(xiàn)的bug了查了些資料,發(fā)現(xiàn)mprotect的使用有一些限制,如“鎖指定的內(nèi)存區(qū)間必須包含整個(gè)內(nèi)存頁(4K)。區(qū)間開始的地址start必須是一個(gè)內(nèi)存頁的起始地址,并且區(qū)間長度len必須是頁大小的整數(shù)倍?!?,自己寫了個(gè)測試用例,是無法mprotect的,返回的errno對應(yīng)的是EINVAL