Bir işlem için ayrılan mevcut belleği (PID ile) bir dosyaya koymak mümkün müdür? Ya da bir şekilde okumak?
Bir işlem için ayrılan mevcut belleği (PID ile) bir dosyaya koymak mümkün müdür? Ya da bir şekilde okumak?
Yanıtlar:
Bunu tekrar tekrar yapmadan tüm hafızayı bir dosyaya nasıl attığınızdan emin değilim (eğer birisi bunu yapmak için gdb'yi otomatik hale getirecek bir yöntem biliyorsa lütfen bana bildirin), ancak aşağıdakiler sizin bildiğinizi varsayarak herhangi bir bellek grubu için geçerlidir Pid:
$ cat /proc/[pid]/maps
Bu formatta olacaktır (örnek):
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
Bir yığın bellek seçin (örneğin, 00621000-00622000), ardından sürece eklemek için gdb'yi kullanın ve bu belleği boşaltın:
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
Ardından dizeleri komutuyla analiz / root / output, ekranın her tarafında PuTTY'yi istersiniz.
Bu görevi gerçekleştiren bir senaryo hazırladım.
Bu fikir James Lawrie'nin cevabından ve bu yazıdan geliyor: 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
bunu bir dosyaya yerleştirin (örn. "dump-all-memory-of-pid.sh") ve çalıştırılabilir hale getirin
kullanımı: ./dump-all-memory-of-pid.sh [pid]
Çıktı, adlara sahip dosyalara yazdırılır: pid-startaddress-stopaddress.dump
Bağımlılıklar: gdb
rw-p
izinleri olan el ele tutuşuyor ve kuklalanıyorsunuz ?
rw-p
), diğer aralıklar code ( r-xp
) içindir. Her ikisinden de bir dökümü istiyorsanız, o zaman devam edin ve grep
örn cat
.
Deneyin
gcore $pid
$pid
ihalenin gerçek sayısı nerede ; daha fazla bilgi için bkz:info gcore
dökümü gerçekleşmesi için biraz zaman alabilir ve bazı bellekler okunamayabilir, ancak yeterince iyi olabilir ... aynı zamanda büyük dosyalar yaratabileceğinin farkında olun, sadece 2GB'lık bir dosya oluşturdum ..
gcore
seyrek dosya damping?
adam proc diyor ki:
/ proc / [pid] / mem Bu dosya, işlem hafızasının sayfalarına açık (2), oku (2) ve lseek (2) aracılığıyla erişmek için kullanılabilir.
Belki sana yardım edebilir
Saf bash çözümü:
procdump ()
{
cat /proc/$1/maps | grep "rw-p" | awk '{print $1}' | ( IFS="-"
while read a b; do
count=$(( bd-ad ))
ad=$(printf "%llu" "0x$a")
bd=$(printf "%llu" "0x$b")
dd if=/proc/$1/mem bs=1 skip=$ad count=$count of=$1_mem_$a.bin
done )
}
Kullanım: procdump PID
Daha temiz bir çöplük için:
procdump ()
{
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
ad=$(printf "%llu" "0x$a")
bd=$(printf "%llu" "0x$b")
dd if=/proc/$1/mem bs=1 skip=$ad count=$(( bd-ad )) of=$1_mem_$a.bin
done )
}
İşlemi standart çıktıya dökmek için kullanılan araç, pcat / memdump:
Artık procdump'ı Linux'taki SysInternals paketinden kullanabilirsiniz:
/proc/$pid/mem
.