在開發和使用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...