static數(shù)據(jù)被修改了

上周六也沒啥事,就去公司了把這周剩下的工作結(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容