一個(gè)運(yùn)行好好地程序寓免,突然在某個(gè)凌晨掛掉了垢袱, 由于系統(tǒng)沒有配置ulimit -c unlimited 窖式。所有沒有CORE 文件出來。
- 首先排查是否人為停止了程序
查看后臺(tái)日志痊项,日志打印信息截止到23:00:04 , 在這么晚的時(shí)間應(yīng)該沒有人還特么加班锅风。并且還停止程序。
使用history 命令看看操作記錄鞍泉,也確實(shí)沒有可疑的操作遏弱。排除人為干擾。 - 排查在23點(diǎn)的時(shí)候塞弊,程序有沒有什么其他的動(dòng)作漱逸。比如日志備份泪姨,數(shù)據(jù)備份。程序自檢等饰抒。
詢問相關(guān)運(yùn)維人員肮砾,23 點(diǎn)程序沒有什么特殊的動(dòng)作。再說程序每天都跑的好好地袋坑,怎么突然就掛了呢仗处。排除 -
查看系統(tǒng)環(huán)境
查看程序常用的系統(tǒng)資源是否有異常
從圖中可以看到,8G 內(nèi)存枣宫,已經(jīng)使用了6.6G 還剩余1.1G cached緩存了2.6G 婆誓。并且居然連交換分區(qū)都用了130M
為啥cached 能緩存了這么多。cached 多說明有進(jìn)程在大量讀文件也颤。應(yīng)該有進(jìn)程再大量操作數(shù)據(jù)庫(kù)洋幻,但不是咱們程序引起的,先不管他翅娶,以后再排查這個(gè)問題文留。
至少內(nèi)存還有1.1G 咱們程序不至于被OOM , 排除
-
查看系統(tǒng)日志
經(jīng)過以上排除竭沫,只有看看系統(tǒng)日志有沒有什么有價(jià)值的信息燥翅,用dmesg 查看
從系統(tǒng)日志看,進(jìn)程3294 段錯(cuò)誤了蜕提,段錯(cuò)誤地址0xfffffffffffffff9 , 取指地址0x00007f5f4c6fc094 堆棧地址0x00007fff94d859d0
出錯(cuò)庫(kù)libstdc++.so.6.0.20 森书,庫(kù)的加載基指為0x7f5f4c637000 ,在庫(kù)文件中的偏移地址0xf3000
錯(cuò)誤碼4 ,參考如下
bit2:值為1表示是用戶態(tài)程序內(nèi)存訪問越界谎势,值為0表示是內(nèi)核態(tài)程序內(nèi)存訪問越界
bit1: 值為1表示是寫操作導(dǎo)致內(nèi)存訪問越界凛膏,值為0表示是讀操作導(dǎo)致內(nèi)存訪問越界
bit0: 值為1表示沒有足夠的權(quán)限訪問非法地址的內(nèi)容,值為0表示訪問的非法地址根本沒有對(duì)應(yīng)的頁(yè)面它浅,也就是無效地址
錯(cuò)誤碼4 剛好表示用戶態(tài)內(nèi)存訪問越界译柏。
從上述信息看,進(jìn)程3294 在地址0xfffffffffffffff9 發(fā)生的系統(tǒng)調(diào)用姐霍。在執(zhí)行l(wèi)ibstdc++.so.6.0.20 中偏移量在0xf3000 之后的某一條指令掛了鄙麦。
我們用 0x00007f5f4c6fc094 - 0x7f5f4c637000 = C5094 。
可定位到在出錯(cuò)指令在庫(kù)libstdc++.so.6.0.20 中偏移量0xf3000處 镊折,再往后偏移0xC5094 個(gè)指令地址 為0x1B8094
反匯編庫(kù)libstdc++.so.6.0.20 將庫(kù)中符號(hào)導(dǎo)出到文件
objdump -tT libstdc++.so.6.0.20 >> testxx.txt
這不是異常處理么胯府,沒法看到是誰引起的異常啊
用addr2line 反匯編試試(-f 表示顯示函數(shù)信息, -e 指定可執(zhí)行文件)
addr2line -f -e libstdc++.so.6.0.20 f3000
啥都看不到。我以為只要定位到庫(kù)中哪個(gè)函數(shù)產(chǎn)生了異常恨胚,然后再代碼中搜索調(diào)用函數(shù)的位置骂因,就可以定位到問題了,看樣子赃泡,是我太年輕了寒波。