今天在公司里遇到一個很奇怪的core dump,初看起來,core dump的code在stl庫的hashtable里,完全沒有任何頭緒,甚至連core dump的原因都一籌莫展。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括喀喇沁網(wǎng)站建設(shè)、喀喇沁網(wǎng)站制作、喀喇沁網(wǎng)頁制作以及喀喇沁網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,喀喇沁網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到喀喇沁省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!白天花了半天的時(shí)候看了一下hashtable的implementation,大概知道該去關(guān)注那些variable,之后用gdb把core dump加載起來,過了一遍幾個重點(diǎn)變量的值,確定了可能是某個singleton的值被correput了,導(dǎo)致原來的class member里的一個unordered_set的underlying的hashtable的值不對了。
經(jīng)過跟同事反復(fù)的討論,最后我們發(fā)現(xiàn)root cause是這樣的:
某個同事在頭文件A.h里定義了一個singleton:
static A& A::getInstance() {
static A a;
return a;
}
然后在某個被稱為plugin B的動態(tài)庫里include了這個頭文件,同時(shí)在binary C的Main.C里也include了這個頭文件。而binary C也同時(shí)通過dlopen加載plugin B。
注意這里就出現(xiàn)了問題,此時(shí)singleton已經(jīng)不完全是singleton了。通過nm命令可以看到binary C和plugin B的symbol table里都有A::getInstance(),并且他們在data section里的地址是不同的,此時(shí)問題已經(jīng)很明顯了。
進(jìn)一步觀察core dump發(fā)生時(shí)的behavior,在那個時(shí)間點(diǎn)binary C reload了一次plugin B,同事懷疑在unload動態(tài)庫的時(shí)候?qū)@個static變量作了一次析構(gòu),而之后重新load plugin B以后,plugin B使用的singleton變量的地址實(shí)際還是binary C的,這時(shí)候binary C里的static變量已經(jīng)被析構(gòu)了,所以造成了ub,同時(shí)造成了core dump!
我們通過一個很簡單的reproducer去重現(xiàn)了core dump,證實(shí)了我們的猜想。
(?code)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前文章:C++在頭文件中定義singleton出現(xiàn)的問題-創(chuàng)新互聯(lián)
文章路徑:http://www.rwnh.cn/article44/dcishe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、關(guān)鍵詞優(yōu)化、企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作、用戶體驗(yàn)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容