Ubuntu20.04出現(xiàn)段錯誤核心已轉(zhuǎn)儲問題解決方案

鏡像下載、域名解析、時間同步請點(diǎn)擊 阿里云開源鏡像站

作為一個半路出家的linuc用戶,coredump這個問題太讓人抓狂了,網(wǎng)上找了好多都是不全面,不適應(yīng)或者看不懂;現(xiàn)在終于解決了,記錄一下防止以后出現(xiàn)還是無解,同時也分享給大家,希望大家能少踩一些坑。

1.什么是段錯誤

core dump又叫核心轉(zhuǎn)儲, 當(dāng)程序運(yùn)行過程中發(fā)生異常, 程序異常退出時, 由操作系統(tǒng)把程序當(dāng)前的內(nèi)存狀況存儲在一個core文件中, 叫core dump. (linux中如果內(nèi)存越界會收到SIGSEGV信號,然后就會core dump)。產(chǎn)生段錯誤的原因大致上有三類:訪問不存在的內(nèi)存地址、訪問系統(tǒng)保護(hù)的內(nèi)存地址和訪問只讀的內(nèi)存地址。

2. 解決方案

網(wǎng)上的資料雖然比較亂,但是也提供了一個解決問題的思路:

(1)設(shè)置core文件,找到段錯誤生成的core文件

(2)利用core文件,使用GDB測試找到問題所在

3.解決過程

先看問題:

file

3.1 生成Core文件

3.1.1 使用ulimit -a命令查看core文件大小限制

file

可以看到core file size的大小為0,文件根本裝不進(jìn),需要使用 ulimit -c unlimited 修改這個文件的大小

file

修改成功后,按照網(wǎng)上的說法,再運(yùn)行程序就會生成core文件,一般路徑和可執(zhí)行程序一個路徑。但是在ubuntu20.04下,怎么也找不到去哪里了(反正我的是這樣),因此需要查看core文件的生成路徑。

3.1.2 在終端輸入 cat /proc/sys/kernel/core_pattern 查看core的生成路徑。

file

轉(zhuǎn)到這個路徑下去找是找不到core文件,這是因?yàn)閡buntu的服務(wù)apport.service。自動生成崩潰報(bào)告,官方為了自動收集錯誤的。我們肯定想到修改路徑的辦法,那就演示一下會怎么樣。

core的設(shè)置主要有兩個命令:

 //控制core文件的文件名中是否添加pid作為擴(kuò)展
echo "1" > /proc/sys/kernel/core_uses_pid  
//設(shè)置core文件的輸出路徑和輸出文件名,這里我的路徑是/home/boy/corefile,文件名就是后面的部分
echo "/home/boy/corefile/core-%e-%p-%t"> /proc/sys/kernel/core_pattern 
 
//參數(shù)說明
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加當(dāng)前uid
%g - insert current gid into filename 添加當(dāng)前gid
%s - insert signal that caused the coredump into the filename 添加導(dǎo)致產(chǎn)生core的信號
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
%h - insert hostname where the coredump happened into filename 添加主機(jī)名
%e - insert coredumping executable name into filename 添加程序名

我直接用echo "/home/boy/corefile/core-%e-%p-%t"> /proc/sys/kernel/core_pattern 進(jìn)行修改,結(jié)果如圖

file

3.1.3 修改core文件生成路徑

因?yàn)槲覀冃薷牡腸ore_pattern文件是只讀文件,沒法這樣修改。所以要換一種思路,修改不了就先停掉apport.service,這個服務(wù)對我們來說基本沒用。

錯誤報(bào)告的部分操作命令如下:

//1.啟用錯誤報(bào)告
sudo systemctl enable apport.service
//或
sudo service apport start
 
//2.關(guān)閉錯誤報(bào)告
sudo systemctl disable apport.service
//或
sudo service apport stop

所以,用sudo service apport stop關(guān)閉錯誤報(bào)告后我們再看core文件的路徑會怎么樣

file

可以看到,路徑發(fā)生了變化,再運(yùn)行一次試試,看現(xiàn)在能不能生成core

file

可以看到,運(yùn)行完后用ll查看生成了core文件,方法有限,下面就是GDB調(diào)試找到錯誤的位置了。

3.2 GDB測試

GDB詳細(xì)說明請看參考資料大佬的整理,這里只記錄一下我怎么測試的

3.2.1 啟動gdb

輸入gdb 運(yùn)行文件 core文件,例如:

gdb  bin/run_vo  core

結(jié)果如下:

file

可以看到對內(nèi)存出現(xiàn)非法訪問時將收到段錯誤信號SIGSEGV下面就是出錯的位置,我們還可以使用backtrace回溯定位問題。

3.2.2 輸入bt回溯定位

file

可以看到現(xiàn)在的報(bào)告更加詳細(xì)。

到此,coredump問題已經(jīng)解決,輸入q,即可退出gdb,剩下就是修改問題部分了。

原文鏈接:https://blog.csdn.net/weixin_52402390/article/details/123900689

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

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

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