Linux下除錯core dump 檔案的方法

2021-08-26 08:06:39 字數 3890 閱讀 8986

在開發和使用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.***x ;為0 則表示生成的

core 檔案同一命名為core。

可通過以下命令修改此檔案:

echo 「1″ > /proc/sys/kernel/core_uses_

pid2)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.***x

使用bt 命令即可看到程式出錯的地方。

以下兩種命令方式具有相同的效果,但是在

有些環境下不生效,所以推薦使用上面的命令。

1)gdb -core=core.***x

file ./a.out

bt2)gdb -c core.***x

file ./a.out

bt4. 開發板上使用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 的方式

來規避這一點.

Linux下除錯總結

感覺linux環境下段錯誤的產生原因及除錯方法小結寫的不錯,列舉了幾個主要的除錯方式。有幾點補充 1.在使用core dump的時候,關於開啟 關閉生成core檔案的命令 ulimit c unlimited 使core檔案大小沒有限制。ulimit c 0 限制core檔案大小為0,即不產生cor...

macOS使用LLDB除錯coredump

對於segmentation fault或者異常退出的程式,macos中使用lldb除錯工具 linux裡是gdb 可以更方便的判斷問題出在 如下 開啟core檔案生成開關 注意這個僅在當前terminal視窗有用 unlimited表示不限制core檔案大小,可以使用 c檢視是否開啟,預設是0 使...

linux下除錯python程式

之前除錯python程式都是用print引數,感覺有點弱爆啊,最近發現python也有類似c語言gdb的工具pdb,記錄下pdb的使用方法和心得。先找了段簡單的測試程式 usr bin python from ftplib import ftpimport sysimport socket impo...