int類型取余導(dǎo)致的core定位過程

1播瞳、問題現(xiàn)象

線上服務(wù)每隔一個多月會出現(xiàn)一次core,core在一個多線程庫的queue里面免糕。

queue使用循環(huán)數(shù)組實(shí)現(xiàn)赢乓,里面主要有以下數(shù)據(jù)成員:

{size_t len;/*數(shù)組長度*/ olatile size_t head;/*隊(duì)列頭*/ volatile size_t tail;/*隊(duì)列尾*/ T* array;/*數(shù)組指針*/}

core的調(diào)用棧位置:array[tail] = std::move(val); core在向隊(duì)列尾添加消息的語句。

dmesg信息:segfault at 2872fa0 ip 000000000047e9e3 sp 00007fcc94ffd360 error 4石窑,非法地址是2872fa0牌芋,core的位置是47e9e3。

2松逊、使用objdump命令將可執(zhí)行文件反匯編躺屁。

array[tail] = std::move(val);語句對應(yīng)的匯編代碼如下:

%rbx存的是queue對象,(%rbx)對應(yīng)qlen经宏,0x8(%rbx)對應(yīng)head犀暑,0x10(%rbx)對應(yīng)tail,0x18(%rbx)對應(yīng)array烁兰。

%rax中存的是無效地址2872fa0耐亏,%rax = array + 8*tail。

3沪斟、查看core文件中寄存器的內(nèi)容广辰,使用info registers命令。

4主之、查看%rbx指向的內(nèi)存的內(nèi)容轨域,從中可以得到queue中成員變量的值,使用x命令杀餐。

可以看出:tail = 4712592干发,array = 4713248,array + 8 * tail = 4713248 +? 8 * 4712592 = 42413984 = 2872fa0史翘,正好是引起core的無效地址枉长。

進(jìn)一步發(fā)現(xiàn) qlen = 4708768冀续,head = 4708864,發(fā)現(xiàn)可疑的地方必峰,首先qlen沒有這么大洪唐,我們設(shè)置的qlen應(yīng)該等于遠(yuǎn)小于這個值,另外qlen也不應(yīng)該小于head和tail吼蚁,這時候考慮可能由兩種情況導(dǎo)致的:(1)queue對象的內(nèi)容被飛踩了(2)queue對象是不是獲取錯了凭需。考慮到queue對象被飛踩定位比較難肝匆,所以先檢查queue對象獲取的是否正確粒蜈。

5、進(jìn)一步檢查代碼旗国,發(fā)現(xiàn)多線程庫中會有多個Consumer枯怖,每個Consumer對應(yīng)一個queue對象,將一個消息發(fā)送給哪個queue是由我們業(yè)務(wù)根據(jù)輪詢選擇的能曾,輪詢的代碼(worker++%worker_num)度硝,而worker定義成int型,int型當(dāng)加到最大值后會出現(xiàn)翻轉(zhuǎn)變成負(fù)數(shù)寿冕,對負(fù)數(shù)取余還是負(fù)數(shù)蕊程,將一個負(fù)數(shù)付給一個ulong型就會變成一個很大的數(shù),導(dǎo)致獲取的queue對象不正確驼唱,最終導(dǎo)致core存捺。

6、進(jìn)一步驗(yàn)證曙蒸,用f命令進(jìn)入業(yè)務(wù)層代碼的frame,用info locals命令查看worker變量的值岗钩。

worker為負(fù)數(shù)纽窟,驗(yàn)證了問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兼吓,一起剝皮案震驚了整個濱河市臂港,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌视搏,老刑警劉巖审孽,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浑娜,居然都是意外死亡佑力,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門筋遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來打颤,“玉大人暴拄,你說我怎么就攤上這事”嘟龋” “怎么了乖篷?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長透且。 經(jīng)常有香客問我撕蔼,道長,這世上最難降的妖魔是什么秽誊? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任鲸沮,我火速辦了婚禮,結(jié)果婚禮上养距,老公的妹妹穿的比我還像新娘诉探。我一直安慰自己,他們只是感情好棍厌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布肾胯。 她就那樣靜靜地躺著,像睡著了一般耘纱。 火紅的嫁衣襯著肌膚如雪敬肚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天束析,我揣著相機(jī)與錄音艳馒,去河邊找鬼。 笑死员寇,一個胖子當(dāng)著我的面吹牛弄慰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝶锋,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼陆爽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扳缕?” 一聲冷哼從身側(cè)響起慌闭,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躯舔,沒想到半個月后驴剔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粥庄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年丧失,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惜互。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡利花,死狀恐怖科侈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炒事,我是刑警寧澤臀栈,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站挠乳,受9級特大地震影響权薯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睡扬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一盟蚣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卖怜,春花似錦屎开、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甩鳄,卻和暖如春逞度,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妙啃。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工档泽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揖赴。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓馆匿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親燥滑。 傳聞我的和親對象是個殘疾皇子渐北,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容