獲取程序的核心轉儲

2021-08-27 15:40:05 字數 1750 閱讀 1463

使用命令ulimit可以檢視核心轉儲功能是否開啟:

$ ulimit -c

0 -c選項表示核心轉儲檔案的大小限制。0表示核心轉儲無效。

可以使用下面的命令開啟:

$ ulimit -c unlimited

再次檢視:

$ ulimit -c

unlimited

執行測試程式

$./test_ulimit 段錯誤 (核心已轉儲)

$ file core

core: elf 32-bit lsb core file intel 80386, version 1 (sysv), svr4-style, from './test_ulimit'

用以下方式啟動gdb:

gdb -c core ./test_ulimit

core was generated by `./test_ulimit'.

program terminated with signal 11, segmentation fault.

#0 0x080483c4 in main () at test_ulimit.c:13

13 *a = 1;

檢視檔案test_ulimit.c的內容:

/* filename:    test_ulimit.c

* description: this program used to show the core dump

* author: howard

* version: v1.0

* time: 2013-11-22

*/#include int main(void)

可見在第13行的地方,給指向空位址(null或者為0)賦值1,在linux記憶體分布中0位址屬於核心位址,不屬於程序自己的位址,所以出現段錯誤。

為了管理上的方便我們讓核心轉儲檔案在特殊的位置上,需要修改/etc/sysctl.conf檔案,在檔案中新增:

kernel.core_pattern = /home//core/%t-%e-%p-%c.core

其中username是使用者自己的使用者名稱。

接下來重複執行test_ulimit程式:

$ ./test_ulimit

段錯誤 (核心已轉儲)

$ ls ../core

1385020307-test_ulimit-3982-4294967295.core

$ file ../core/1385020307-test_ulimit-3982-4294967295.core

../core/1385020307-test_ulimit-3982-4294967295.core: elf 32-bit lsb core file intel 80386, version 1 (sysv), svr4-style, from './test_ulimit'

注:要是想轉儲到其他的目錄,要確定有寫許可權,而且路徑中所有的目錄正確。

kernel.core_pattern中可設定的格式符:

格式符說明%%

%字元本身

%p被轉儲程序的id

%u被轉儲程序的真實使用者id

%g被轉儲程序的真實組id

%s引發轉儲的訊號編號

%t轉儲時刻(從2023年1月1號0點開始的秒數)

%h主機名

%e可執行檔名

%c轉儲檔案大小的上限

核心檔案 核心轉儲

核心檔案 核心檔案 core file 也稱核心轉儲 core dump 是作業系統 在程序收到某些訊號 而終止執行時,將此時程序位址空間的內容以及有關程序狀態的其他資訊寫出的乙個磁碟檔案。這種資訊往往用於除錯。核心檔案一詞 於磁芯記憶體 core memory 核心轉儲 通常這個詞的含義是乙個動作...

Ubuntu的核心轉儲工具

ubuntu 官方連線 kdump是乙個linux核心崩潰轉儲機制,這個機制的原理是在記憶體中保留一塊區域,這塊區域用來存放capture kernel,當前的核心發生crash後,通過kexec把保留區域的capture kernel執行起來,由capture kernel負責把crash ker...

kdump轉儲的核心實現

前面一篇文章介紹了kexec和kdump的思想,本文著重講它們的另乙個方面,就是kdump到底是如何轉儲垮掉核心的記憶體映像的。首先定義乙個鍊錶,它很重要。static list head vmcore list unsigned long long elfcorehdr addr elfcore ...