Linux下調試core dump 檔案的方法

來源:互聯網
上載者:User

在開發和使用Linux 程式時,引擎有時會莫名
其妙的core 掉,在網上查了一下,整理了一個簡
單的調試core 檔案的方法。
1、什麼是core dump?
Core,即core memory,而dump 就是堆放的
意思。core dump 又叫核心轉儲,當程式運行過
程中發生異常,程式異常退出時,由作業系統把
程式當前的記憶體狀況儲存在一個core 檔案中,
叫core dump。
2、如何開啟core dump支援?
有的作業系統並沒有預設開啟core dump 支
持,需要用ulimit -c unlimited 語句進行設定,
core 檔案產生的位置一般在程式啟動並執行當前目
錄下,檔案名稱為core. 進程號( 當然不同的系統
也許有所不同,可以查看相手冊對路徑和檔案名稱
進行設定).
3、Core dump的使用方法
首先應該在用gcc 進行編譯時間選擇-g 選項,
以便起動debug 支援,產生可執行檔時ex,./
ex 運行可執行檔,如果程式當掉,則會產生
一個core 檔案,假設為core.1568,則gdb ex
core.1568 進入gdb,然後再用where 命令進行
查看即可。
先看看我用的是個什麼機器:
$ uname -a
再看看預設的一些參數,注意core file size
是個0,程式出錯時不會產生core 檔案了。
$ ulimit -a
core file size (blocks, -c) 0
……
寫個簡單的程式,看看core 檔案是不是會被
產生。
(代碼略)
$ gcc -Wall -g foo.c
$ ./a.out
Segmentation fault
$ ls -l core.*
ls: core.*: No such file or directory
沒有找到core 檔案,我們改改ulimit 的設定,
讓它產生。1024 是隨便取的,要是core 檔案大
於1024 個塊,就產生不出來了。
$ ulimit -c 1024
$ ulimit -a
core file size (blocks, -c) 1024
……
$ ./a.out
Segmentation fault (core dumped)
$ ls -l core.*
-rw------- 1 uniware uniware 53248
Jun 30 17:10 core.9128
注意看上述的輸出資訊,多了個(core
dumped)。確實產生了一個core 檔案,9128 是
該進程的PID。我們用GDB 來看看這個core。
$ gdb --core=core.9128
(輸出資訊略)
(gdb) bt
#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()
此時用bt 看不到backtrace,也就是呼叫堆疊,
原來GDB 還不知道符號資訊在哪裡。我們告訴
它一下:

(gdb) file ./a.out

(gdb) bt
#0 0x08048373 in sub () at foo.c:17
#1 0x08048359 in main () at foo.c:8
此時backtrace 出來了。
在程式不尋常退出時,核心會在當前工作目
錄下產生一個core 檔案(是一個記憶體映像,同時
加上調試資訊)。使用gdb 來查看core 檔案,可
以指示出導致程式出錯的代碼所在檔案和行數。
其他總結
1.core檔案的產生開關和大小限制
1)使用ulimit -c 命令可查看core 檔案的生
成開關。若結果為0,則表示關閉了此功能,不
會產生core 檔案。
2)使用ulimit -c filesize 命令,可以限制
core 檔案的大小(filesize 的單位為kbyte)。若
ulimit -c unlimited,則表示core 檔案的大小不
受限制。如果產生的資訊超過此大小,將會被裁
剪,最終產生一個不完整的core 檔案。在調試
此core 檔案的時候,gdb 會提示錯誤。
2.core檔案的名稱和產生路徑
core 檔案產生路徑:
輸入可執行檔運行命令的同一路徑下。
若系統產生的core 檔案不帶其他任何副檔名
稱,則全部命名為core。新的core 檔案產生將
覆蓋原來的core 檔案。
1)/proc/sys/kernel/core_uses_pid 可以控
制core 檔案的檔案名稱中是否添加pid 作為擴充。
檔案內容為1,表示添加pid 作為副檔名,產生的
core 檔案格式為core.xxxx ;為0 則表示產生的
core 檔案同一命名為core。
可通過以下命令修改此檔案:
echo “1″ > /proc/sys/kernel/core_uses_
pid
2)proc/sys/kernel/core_pattern 可以控制
core 檔案儲存位置和檔案名稱格式。
可通過以下命令修改此檔案:
e c h o “/ c o r e f i l e / c o r e -%e -%p -%t” >
core_pattern,可以將core 檔案統一產生到/
corefile 目錄下,產生的檔案名稱為core- 命令
名-pid- 時間戳記
3.core檔案的查看
core 檔案需要使用gdb 來查看。
gdb ./a.out
core-file core.xxxx
使用bt 命令即可看到程式出錯的地方。
以下兩種命令方式具有相同的效果,但是在
有些環境下不生效,所以推薦使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt
4. 開發板上使用core 檔案調試
在 PC 上調試開發板上產生的core 檔案,需
要使用交叉編譯器內建的gdb,並且需要在gdb
中指定solib-absolute-prefix 和 solib-searchpath
兩個變數以保證gdb 能夠找到可執行程式
的依賴庫路徑。有一種建立設定檔的方法,不
需要每次啟動gdb 都配置以上變數,即:在待運
行gdb 的路徑下建立.gdbinit。
設定檔內容:
set solib-abso lute-prefix YOUR_CROSS_
COMPILE_PATH
s e t s o l i b - s e a r c h - p a t h Y O U R _ C R O S S _
COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_
TOOLS_LIB_PATH
handle SIG32 nostop noprint pass
注意:待調試的可執行檔,在編譯的時候需
要加-g,core 檔案才能正常顯示出錯資訊!有
時候core 資訊很大,可以通過掛載到PC 的方式
來規避這一點.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.