プロセスに割り当てられた現在のメモリを(PIDで)ファイルにダンプすることはできますか?それとも何とか読む?
プロセスに割り当てられた現在のメモリを(PIDで)ファイルにダンプすることはできますか?それとも何とか読む?
回答:
これを繰り返し行わずにすべてのメモリをファイルにダンプする方法はわかりません(gdbにこれを行う自動化された方法を知っている人がいる場合はお知らせください) PID:
$ cat /proc/[pid]/maps
これは次の形式になります(例)。
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
メモリのバッチを1つ選択し(たとえば00621000-00622000)、gdbをルートとして使用してプロセスにアタッチし、そのメモリをダンプします。
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
次に、文字列コマンドで/ root / outputを分析します。画面全体にPuTTYが必要な場合は少なくなります。
このタスクを実行するスクリプトを作成しました。
アイデアはジェームズ・ローリーの答えとこの投稿から来ています: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
これをファイル(例: "dump-all-memory-of-pid.sh")に入れて実行可能にします
使用法: ./dump-all-memory-of-pid.sh [pid]
出力は、次の名前のファイルに出力されます。 pid-startaddress-stopaddress.dump
依存関係: gdb
rw-p
ですか?
rw-p
(r-xp
)です。他の範囲はコード()です。両方のダンプが必要な場合はgrep
、たとえばに交換してくださいcat
。
試してみる
gcore $pid
$pid
pidの実際の番号はどこですか。詳細については、以下を参照してください。info gcore
ダンプが発生するまでに時間がかかることがあり、一部のメモリは読み取り可能ではないかもしれませんが、十分です...大きなファイルを作成できることに注意してください、私はちょうど2GBのファイルをそのように作成しました。
gcore
スパースファイルをダンプ?
man procのコメント:
/ proc / [pid] / memこのファイルは、open(2)、read(2)、およびlseek(2)を介してプロセスのメモリのページにアクセスするために使用できます。
たぶんそれはあなたを助けることができる
純粋なbashソリューション:
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 )
}
使用法:procdump PID
よりクリーンなダンプの場合:
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 )
}
プロセスを標準出力pcat / memdumpにダンプするツール:
LinuxのSysInternalsスイートからprocdumpを使用できるようになりました。
/proc/$pid/mem
。