新聞中心
在Linux上怎么得到一個(gè)段錯(cuò)誤的核心轉(zhuǎn)儲(chǔ)

成都創(chuàng)新互聯(lián)公司總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)絡(luò)營銷策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號(hào)搭建、微信小程序開發(fā)、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷領(lǐng)域創(chuàng)造價(jià)值而不懈努力!
段錯(cuò)誤(Segmentation fault)是指程序試圖訪問一個(gè)它無權(quán)訪問的內(nèi)存區(qū)域,通常是由于程序中的指針錯(cuò)誤或者數(shù)組越界等原因?qū)е碌?,?dāng)程序發(fā)生段錯(cuò)誤時(shí),操作系統(tǒng)會(huì)生成一個(gè)核心轉(zhuǎn)儲(chǔ)文件(core dump),以便開發(fā)人員分析問題原因,本文將介紹如何在Linux系統(tǒng)上獲取段錯(cuò)誤的核心轉(zhuǎn)儲(chǔ)文件。
生成核心轉(zhuǎn)儲(chǔ)文件
1、設(shè)置核心轉(zhuǎn)儲(chǔ)文件大小限制
要生成核心轉(zhuǎn)儲(chǔ)文件,首先需要設(shè)置系統(tǒng)的內(nèi)存大小限制,可以通過修改/proc/sys/kernel/core_pattern文件來實(shí)現(xiàn),將核心轉(zhuǎn)儲(chǔ)文件的大小限制設(shè)置為256MB:
echo "/tmp/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern echo 256 > /proc/sys/kernel/core_pattern_size
這里,%e表示可執(zhí)行文件名,%s表示進(jìn)程ID,%u表示用戶ID,%g表示組ID,%p表示進(jìn)程的PID,%t表示時(shí)間戳,這些占位符將在生成的核心轉(zhuǎn)儲(chǔ)文件名中被實(shí)際值替換。
2、設(shè)置核心轉(zhuǎn)儲(chǔ)文件的生成條件
除了設(shè)置核心轉(zhuǎn)儲(chǔ)文件的大小限制外,還可以設(shè)置生成核心轉(zhuǎn)儲(chǔ)文件的條件,只在進(jìn)程接收到SIGSEGV信號(hào)時(shí)生成核心轉(zhuǎn)儲(chǔ)文件:
echo "/tmp/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern echo "%p %s" > /proc/sys/kernel/core_pattern_extra echo 1 > /proc/sys/kernel/core_pattern_filter
這里,%p表示進(jìn)程的PID,%s表示信號(hào)名稱。%p %s表示只有當(dāng)進(jìn)程接收到SIGSEGV信號(hào)時(shí)才會(huì)生成核心轉(zhuǎn)儲(chǔ)文件,其他可用的信號(hào)有SIGABRT、SIGFPE等。
3、確保系統(tǒng)允許生成核心轉(zhuǎn)儲(chǔ)文件
要確保系統(tǒng)允許生成核心轉(zhuǎn)儲(chǔ)文件,需要使用root權(quán)限運(yùn)行上述命令:
sudo su echo "/tmp/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern echo "%p %s" > /proc/sys/kernel/core_pattern_extra echo 1 > /proc/sys/kernel/core_pattern_filter
分析核心轉(zhuǎn)儲(chǔ)文件
1、使用gdb工具分析核心轉(zhuǎn)儲(chǔ)文件
要分析核心轉(zhuǎn)儲(chǔ)文件,可以使用GNU Debugger(gdb)工具,首先安裝gdb:
sudo apt-get install gdb
然后使用以下命令啟動(dòng)gdb并加載核心轉(zhuǎn)儲(chǔ)文件:
gdb
是可執(zhí)行文件的路徑,是核心轉(zhuǎn)儲(chǔ)文件的路徑,在gdb中,可以使用各種命令來查看和分析程序的狀態(tài),
bt:查看當(dāng)前函數(shù)調(diào)用棧;
info registers:查看寄存器的值;
list *0x12345678:查看地址為0x12345678的內(nèi)存內(nèi)容;
print variable_name:打印名為variable_name的變量的值;
quit:退出gdb。
2、使用Valgrind工具分析程序內(nèi)存錯(cuò)誤
Valgrind是一個(gè)用于內(nèi)存管理和線程錯(cuò)誤檢測的工具集,它可以自動(dòng)檢測程序中的內(nèi)存錯(cuò)誤,并生成詳細(xì)的報(bào)告,要使用Valgrind分析程序,首先安裝Valgrind:
sudo apt-get install valgrind
然后使用以下命令運(yùn)行Valgrind:
valgrind --leak-check=full --show-leak-kinds=all
是可執(zhí)行文件的路徑,是傳遞給程序的參數(shù),Valgrind會(huì)在后臺(tái)運(yùn)行程序,并在程序結(jié)束時(shí)輸出內(nèi)存錯(cuò)誤報(bào)告,通過閱讀報(bào)告,可以找到導(dǎo)致段錯(cuò)誤的原因。
網(wǎng)頁題目:在Linux上怎么得到一個(gè)段錯(cuò)誤的核心轉(zhuǎn)儲(chǔ)
標(biāo)題鏈接:http://www.dlmjj.cn/article/djicipd.html


咨詢
建站咨詢
