1.core文件
當(dāng)程序運(yùn)行過程中出現(xiàn)Segmentation fault (core dumped)錯(cuò)誤時(shí),程序停止運(yùn)行,并產(chǎn)生core文件。core文件是程序運(yùn)行狀態(tài)的內(nèi)存映象。使用gdb調(diào)試core文件,可以幫助我們快速定位程序出現(xiàn)段錯(cuò)誤的位置。當(dāng)然,可執(zhí)行程序編譯時(shí)應(yīng)加上-g編譯選項(xiàng),生成調(diào)試信息。
當(dāng)程序訪問的內(nèi)存超出了系統(tǒng)給定的內(nèi)存空間,就會(huì)產(chǎn)生Segmentation fault (core dumped),因此,段錯(cuò)誤產(chǎn)生的情況主要有:
(1)訪問不存在的內(nèi)存地址;
(2)訪問系統(tǒng)保護(hù)的內(nèi)存地址;
(3)數(shù)組訪問越界等。
core dumped又叫核心轉(zhuǎn)儲(chǔ), 當(dāng)程序運(yùn)行過程中發(fā)生異常, 程序異常退出時(shí), 由操作系統(tǒng)把程序當(dāng)前的內(nèi)存狀況存儲(chǔ)在一個(gè)core文件中, 叫core dumped。
core意指core memory,用線圈做的內(nèi)存。如今 ,半導(dǎo)體工業(yè)澎勃發(fā)展,已經(jīng)沒有人用 core memory 了,不過,在許多情況下,人們還是把記憶體叫作 core 。
2.控制core文件是否生成
(1)使用ulimit -c命令可查看core文件的生成開關(guān)。若結(jié)果為0,則表示關(guān)閉了此功能,不會(huì)生成core文件。
(2)使用ulimit -c filesize命令,可以限制core文件的大?。╢ilesize的單位為KB)。如果生成的信息超過此大小,將會(huì)被裁剪,最終生成一個(gè)不完整的core文件。在調(diào)試此core文 件的時(shí)候,gdb會(huì)提示錯(cuò)誤。比如:ulimit -c 1024。
(3)使用ulimit -c unlimited,則表示core文件的大小不受限制。
在終端通過命令ulimit -c unlimited只是臨時(shí)修改,重啟后無效 ,要想永久修改有三種方式:
(1)在/etc/rc.local 中增加一行 ulimit -c unlimited
(2)在/etc/profile 中增加一行 ulimit -c unlimited
(3)在/etc/security/limits.conf最后增加如下兩行記錄:
@root soft core unlimited
@root hard core unlimited
3.core文件的名稱和生成路徑
core默認(rèn)的文件名稱是core.pid,pid指的是產(chǎn)生段錯(cuò)誤的程序的進(jìn)程號(hào)。
默認(rèn)路徑是產(chǎn)生段錯(cuò)誤的程序的當(dāng)前目錄。
如果想修改core文件的名稱和生成路徑,相關(guān)的配置文件為:
/proc/sys/kernel/core_uses_pid:控制產(chǎn)生的core文件的文件名中是否添加pid作為擴(kuò)展,如果添加則文件內(nèi)容為1,否則為0。
/proc/sys/kernel/core_pattern:可以設(shè)置格式化的core文件保存的位置和文件名,比如原來文件內(nèi)容是core-%e。
可以這樣修改:
echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
將會(huì)控制所產(chǎn)生的core文件會(huì)存放到/corefile目錄下,產(chǎn)生的文件名為:core-命令名-pid-時(shí)間戳。
以下是參數(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的信號(hào)
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成時(shí)的unix時(shí)間
%h - insert hostname where the coredump happened into filename 添加主機(jī)名
%e - insert coredumping executable name into filename 添加命令名。
一般情況下,無需修改,按照默認(rèn)的方式即可。
4.gdb調(diào)試core文件的步驟
使用gdb調(diào)試core文件來查找程序中出現(xiàn)段錯(cuò)誤的位置時(shí),要注意的是可執(zhí)行程序在編譯的時(shí)候需要加上-g編譯命令選項(xiàng)。
gdb調(diào)試core文件的步驟常見的有如下幾種,推薦第一種。
具體步驟一:
(1)啟動(dòng)gdb,進(jìn)入core文件,命令格式:gdb [exec file] [core file]。
用法示例:gdb ./test test.core。
(2)在進(jìn)入gdb后,查找段錯(cuò)誤位置:where或者bt
用法示例:
可以定位到源程序中具體文件的具體位置,出現(xiàn)了段錯(cuò)誤。
具體步驟二:
(1)啟動(dòng)gdb,進(jìn)入core文件,命令格式:gdb –core=[core file]。
用法示例:gdb –core=test.core。
(2)在進(jìn)入gdb后,指定core文件對(duì)應(yīng)的符號(hào)表,命令格式:file [exec file] .
用法示例:
具體步驟三:
(1)啟動(dòng)gdb,進(jìn)入core文件,命令格式:gdb -c [core file]。
用法示例:gdb -core test.core。
(2)其它步驟同步驟二。
5.其它查找段錯(cuò)誤位置的方法
可以使用gdb進(jìn)行單步調(diào)試,來查找段錯(cuò)誤出錯(cuò)的位置。gdb的用例具體見:
Linux下gdb用法簡(jiǎn)單介紹。
以上就是Linux下如何使用gdb調(diào)試core文件的詳細(xì)內(nèi)容,更多關(guān)于Linux gdb調(diào)試core文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!