coredump Linux記憶體轉儲

2021-06-09 15:25:40 字數 2718 閱讀 6275

coredump

簡單來說,core dump說的是作業系統執行的乙個動作,當某個程序因為一些原因意外終止(crash)的時候,作業系統會將這個程序當時的記憶體資訊轉儲(dump)到磁碟上1。產生的檔案就是core檔案了,一般會以core.***形式命名。

如何產生core dump

一般來說, 當程序接收到某個訊號導致程序退出或crash(崩潰)的時候, 會產生乙個 core dump 檔案.

比如經常遇到的陣列越界或者訪問空指標都會產生乙個sigsegv型號, 導致程式崩潰, 這個時候就會產生乙個core dump.

以下是預設產生 coredump 的一些訊號.

3)sigquit   4)sigill   6)sigabrt   8)sigfpe    11)sigsegv    7)sigbus   31)sigsys

5)sigtrap   24)sigxcpu 25)sigxfsz  29)sigiot

需要注意的是當程式自己接管了訊號處理後不會產生core dump了.

core dump 設定

以上只是產生coredump的必要條件,而非充分條件。要產生core檔案還依賴於程式執行的shell,可以通過ulimit -c命令檢視core file size設定. 這個值用來限制產生的 core 檔案大小, 超過這個值就不會儲存了. 如果設定為0,就是不會儲存core檔案. 即使產生了, 也不會儲存. 可以使用 ulimit-c unlimited 將core dump開啟.

預設情況下,產生的 core dump 檔名為 core. 可以通過設定核心引數

/proc/sys/kernel/core_pattern設定產生 core 檔案的模板.

以下是引數列表:

%p - 檔名新增pid

%u - 檔名新增當前uid

%g - 檔名新增當前gid

%s - 檔名新增導致產生core的訊號

%t - 檔名新增core檔案生成時的unix時間

%h - 檔名新增主機名

%e - 檔名新增執行檔名

如果  /proc/sys/kernel/core_pattern 模板不包含 "%p" 且

/proc/sys/kernel/core_uses_pid 為非0, 則當前 pid 將新增到 core 檔案命.

gdb 除錯 core dump

建立乙個空指標的crash.c

int crash(void *in)

int main(int argc,char **argv)

~ root@ubuntu:/work/code#gcc -g crash.c  -o crash

gcc -g 

引數很重要, 可以產生除錯 symbol直接定位錯誤檔案, 函式,**行.

root@ubuntu:/work/code#./crash

segmentationfault (core dumped)

產生core dump 檔案.

root@ubuntu:/work/code#gdb crash  core

readingsymbols from /work/code/crash...done.

[new thread2294]

warning: can'tread pathname for load map: input/output error.

readingsymbols from /lib/libc.so.6...(no debugging symbols found)...done.

loaded symbolsfor /lib/libc.so.6

readingsymbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.

loaded symbolsfor /lib64/ld-linux-x86-64.so.2

core wasgenerated by `./crash'.

programterminated with signal 11, segmentation fault.

#0  0x00000000004004d8 in crash (in=0x0) atcrash.c:14

14              *ptr = 0x1;

(gdb)

此刻已馬上定位到crash.c 14 行.

也呼叫 gdbwhere/backtrace 檢視當前的函式呼叫棧的所有資訊.

(gdb) where

#0  0x00000000004004d8 in crash (in=0x0) atcrash.c:14

#1  0x00000000004004fb in main (argc=1,argv=0x7fffdb7f6998) at crash.c:20

(gdb)backtrace

#0  0x00000000004004d8 in crash (in=0x0) atcrash.c:14

#1  0x00000000004004fb in main (argc=1,argv=0x7fffdb7f6998) at crash.c:20

(gdb)

顯示所有執行緒的呼叫棧資訊

可以參考系統core詳細說明 :

man core

還是記憶體 記憶體

對於記憶體一點都不了解到現在感覺上已經蠻了解的,可是事實上又遇到麻煩了 實在是想不通,怎麼會出現問題呢?重新審視一下動態開闢記憶體的操作 1.對於函式以及函式內的臨時變數我們不需要考慮它們的記憶體空間,因為在函式執行結束的時候會自動釋放掉.真的是這樣的嗎?如果是這樣的話,對於固定陣列我若開闢乙個足夠...

《記憶體管理》 記憶體

1.c c 記憶體分布 我們先來看下面的一段 和相關問題 int globalvar 1 static int staticglobalvar 1 void test char char2 abcd char pchar3 abcd int ptr1 int malloc sizeof int 4 ...

記憶體分配 記憶體分段 記憶體分頁 虛擬記憶體

記憶體應容納作業系統和各種使用者程序,因此應該盡可能有效地分配記憶體。通常,我們需要將多個程序同時放在記憶體中。因此我們需要考慮,如何為輸入佇列中需要調入記憶體的程序分配記憶體空間。在採用連續記憶體分配時,每個程序位於乙個連續的記憶體區域,與包含下乙個程序的記憶體相連。1.最為簡單的記憶體分配方法之...