佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > Linux下如何使用gdb調(diào)試core文件

Linux下如何使用gdb調(diào)試core文件

熱門標(biāo)簽:阿里云 美圖手機(jī) 使用U盤裝系統(tǒng) 百度競價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 智能手機(jī) 檢查注冊(cè)表項(xiàng) 網(wǎng)站建設(shè) 硅谷的囚徒呼叫中心

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用法簡單介紹。

以上就是Linux下如何使用gdb調(diào)試core文件的詳細(xì)內(nèi)容,更多關(guān)于Linux gdb調(diào)試core文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

標(biāo)簽:黃山 湖北 山南 煙臺(tái) 通遼 湘潭 懷化 賀州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux下如何使用gdb調(diào)試core文件》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    金坛市| 图们市| 凤凰县| 济阳县| 荣成市| 延寿县| 枣庄市| 禄劝| 蕲春县| 嘉峪关市| 吴堡县| 普安县| 凤翔县| 阳山县| 安达市| 桂阳县| 罗江县| 尉犁县| 广德县| 沈阳市| 莆田市| 梅河口市| 文化| 保康县| 德阳市| 信丰县| 阿鲁科尔沁旗| 孟津县| 合山市| 甘德县| 高邑县| 卢湾区| 白银市| 宜州市| 徐汇区| 茂名市| 壶关县| 恩平市| 木兰县| 施秉县| 济南市|