Linux 正在執行的 Process 不定期的掛掉, 掛掉前剛好都有現象可以知道, 於是需要將掛掉前的 Process Memory Dump 出來看看, 找出到底是哪邊出問題.
將 Linux Process 的 Memory Dump 到檔案
下述有三種方法(如下述), 第一個方法的步驟最多, 不過是最容易把問題找出來的方法~
- 將 Process [Pid] 的區段 Memory Dump 到檔案
- 將此 pid 所有區段的 Memory 都 Dump 出來
- 產生 正在執行 Process 的 Core file
下述命令參考自此篇: Dump a linux process's memory to file - Server Fault
將 Process [Pid] 的區段 Memory Dump 到檔案
- cat /proc/[pid]/maps
00621000-00622000 rw-p 00021000 08:01 592398 /usr/libexec/dovecot/pop3-login
00622000-0066a000 rw-p 00622000 00:00 0 [heap] 3e73200000-3e7321c000 r-xp
00000000 08:01 229378 /lib64/ld-2.5.so 3e7341b000-3e7341c000 r--p 0001b000 08:01 229378 /lib64/ld-2.5.s
由上述找到有問題的區段, 再用下述 gdb dump. (註: 會 dump 到 /root/outpub 這個檔案)
- gdb --pid [pid]
- (gdb) dump memory /root/output 0x00621000 0x00622000
將此 pid 所有區段的 Memory 都 Dump 出來
- vim ./dump-all-memory-of-pid.sh
#!/bin/bash
grep rw-p /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done
./dump-all-memory-of-pid.sh [pid] # 會產生很多檔案, ex: [pid]-7f8d64000000-7f8d64021000.dump
產生 正在執行 Process 的 Core file
- gcore pid # 會存 core-[pid] 的檔案 (gcore - Generate a core file for a running process)
- 註: 記憶體佔用多大, 此檔案 Dump 出來就有多大, 要注意硬碟空間是否夠用.
查看 pid 詳細資料
- strace -p pid