Solusi 1:
Saya telah membuat skrip yang menyelesaikan tugas ini.
Idenya berasal dari jawaban James Lawrie dan posting ini:http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195
#!/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
letakkan ini di file (mis. "dump-all-memory-of-pid.sh") dan buat itu bisa dieksekusi
penggunaan:./dump-all-memory-of-pid.sh [pid]
Output dicetak ke file dengan nama:pid-startaddress-stopaddress.dump
Ketergantungan:gdb
Solusi 2:
Saya tidak yakin bagaimana Anda membuang semua memori ke file tanpa melakukan ini berulang kali (jika ada yang tahu cara otomatis untuk mendapatkan gdb untuk melakukan ini, beri tahu saya), tetapi berikut ini berfungsi untuk satu kumpulan memori dengan asumsi Anda tahu pid:
$ cat /proc/[pid]/maps
Ini akan dalam format (contoh):
00400000-00421000 r-xp 00000000 08:01 592398 /usr/libexec/dovecot/pop3-login
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.so
Pilih satu kumpulan memori (jadi misalnya 00621000-00622000) lalu gunakan gdb sebagai root untuk melampirkan ke proses dan buang memori itu:
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
Kemudian analisis /root/output dengan perintah strings, semakin sedikit Anda menginginkan PuTTY di seluruh layar Anda.
Solusi 3:
coba
gcore $pid
di mana $pid
adalah jumlah sebenarnya dari pid; untuk info lebih lanjut lihat:info gcore
mungkin perlu waktu untuk dump terjadi, dan beberapa memori mungkin tidak dapat dibaca, tetapi cukup baik... perhatikan juga bahwa ini dapat membuat file besar, saya baru saja membuat file 2GB dengan cara itu..
Solusi 4:
Solusi bash murni:
procdump()
(
cat /proc/$1/maps | grep "rw-p" | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
)
Penggunaan:procdump PID
untuk filter pembuangan yang lebih bersih keluar *.so
perpustakaan bersama yang dipetakan memori dan rentang memori kosong:
procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
)
Solusi 5:
man proc berkata :
/proc/[pid]/memFile ini dapat digunakan untuk mengakses halaman memori proses melalui open(2), read(2), dan lseek(2).
Mungkin itu bisa membantu Anda