將 Linux Process 的 Memory Dump 到檔案

Linux 正在執行的 Process 不定期的掛掉, 掛掉前剛好都有現象可以知道, 於是需要將掛掉前的 Process Memory Dump 出來看看, 找出到底是哪邊出問題.

將 Linux Process 的 Memory Dump 到檔案

下述有三種方法(如下述), 第一個方法的步驟最多, 不過是最容易把問題找出來的方法~

  1. 將 Process [Pid] 的區段 Memory Dump 到檔案
  2. 將此 pid 所有區段的 Memory 都 Dump 出來
  3. 產生 正在執行 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 這個檔案)

  1. gdb --pid [pid]
  2. (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

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料