GNU/Linux >> Belajar Linux >  >> Linux

Buang memori proses linux ke file

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


Linux
  1. Penggunaan Memori Linux

  2. Linux – Batasi Penggunaan Memori Untuk Proses Linux Tunggal?

  3. Linux – Semuanya Adalah File?

  1. Jumlah maksimum utas per proses di Linux?

  2. Ambil penggunaan CPU dan penggunaan memori dari satu proses di Linux?

  3. Mulai ulang proses perubahan file di Linux

  1. Bagaimana Saya Dapat Membuat File Dump dari Proses yang Berjalan di Linux?

  2. mencatat memori RAM tanda air tinggi dari proses Linux

  3. Bagaimana cara menempatkan / menyimpan file di memori di linux?