GNU/Linux >> Linux の 問題 >  >> Linux

Linux プロセスのメモリをファイルにダンプする

解決策 1:

このタスクを実行するスクリプトを作成しました。

このアイデアは、James Lawrie の回答とこの投稿から生まれました。

#!/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

解決策 2:

これを繰り返し実行せずにすべてのメモリをファイルにダンプする方法はわかりません (gdb にこれを実行させる自動化された方法を誰かが知っている場合はお知らせください)。ピッド:

$ 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

次に、strings コマンドを使用して /root/output を分析します。画面全体に PuTTY を配置する必要はありません。

解決策 3:

試してみてください

    gcore $pid

どこで $pid pid の実際の番号です。詳細については、次を参照してください:info gcore

ダンプが発生するまでに時間がかかる場合があり、一部のメモリは読み取れない場合がありますが、十分です...大きなファイルが作成される可能性があることにも注意してください.2GBのファイルをそのように作成しました..

解決策 4:

純粋な bash ソリューション:

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 )
)

使用法:procdump PID

よりクリーンなダンプのために *.so を除外します メモリ マップされた共有ライブラリと空のメモリ範囲:

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 )
)

解決策 5:

man proc のコメント:

<ブロック引用>

/proc/[pid]/memこのファイルは、open(2)、read(2)、および lseek(2) を通じてプロセスのメモリのページにアクセスするために使用できます。

多分それはあなたを助けることができます


Linux
  1. Linux のプロセスあたりの最大スレッド数は?

  2. Linux/Unix プロセスのピーク時のメモリ使用量

  3. Linuxで単一プロセスのCPU使用率とメモリ使用率を取得しますか?

  1. Linux で実行中のプロセスのダンプ ファイルを作成するにはどうすればよいですか?

  2. Linux プロセスの RAM メモリ最高水準点のロギング

  3. Live OS :安全なファイル削除

  1. Linuxのメモリ使用量

  2. 単一の Linux プロセスのメモリ使用量を制限する

  3. Linuxでファイルをメモリに配置/保存する方法は?