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 tolong beri tahu saya), tetapi yang berikut ini berfungsi untuk satu batch memori dengan asumsi Anda tahu pid:
Luar biasa! Hanya menggunakannya untuk menemukan skrip mana yang dijalankan instance misterius bash.
Tobia
Mengapa Anda hanya mengambil dan membuang rentang dengan rw-pizin?
mxmlnkn
@mxmlnkn Itu data ( rw-p), rentang lain untuk kode ( r-xp). Jika Anda ingin dump keduanya, maka maju dan tukar grepmisalnya cat.
A. Nilsson
39
mencoba
gcore $pid
di mana $pidjumlah aktual pid; untuk info lebih lanjut lihat:info gcore
mungkin memerlukan beberapa waktu agar dump terjadi, dan beberapa memori mungkin tidak dapat dibaca, tetapi cukup bagus ... perlu diketahui juga bahwa itu dapat membuat file besar, saya baru saja membuat file 2GB seperti itu ..
Itu tidak cukup, membaca proses lain membutuhkan kombinasi / proc / <pid> / {mem, * maps}, ptrace, dan beberapa penanganan sinyal untuk menghindari menggantungnya proses target.
Saya membuat program saya sendiri untuk membuang seluruh memori proses juga, itu dalam C sehingga dapat dikompilasi silang ke Android, yang saya butuhkan.
Anda juga dapat menentukan alamat IP dan port tcp. Kode sumber di sini .
Jadi, dari apa yang saya pahami, ide di balik dump cleaner adalah bahwa hanya file dalam memori yang memiliki ukuran yang melekat pada wilayah memori berbeda dengan memori aplikasi aktual, yang memiliki ukuran 0 (karena ukuran sebenarnya ukuran yang digunakan tidak diketahui oleh OS).
mxmlnkn
Satu masalah yang saya miliki dengan skrip ini adalah bahwa blocksize dari 1 mengarah ke bandwidth yang sangat lambat ~ 30kB / s dibandingkan dengan menggunakan blocksize yang sama dengan ukuran halaman (4096 untuk saya) yang saya dapatkan ~ 100MB / s! Lihat di sini . getconf PAGESIZEdigunakan untuk mendapatkan ukuran halaman dan kemudian alamat dan jumlah dibagi dengan itu.
mxmlnkn
1
Alat untuk membuang proses ke output standar, pcat / memdump:
Yang ini sudah usang (dihapus atas permintaan pengelola); Saya tetap menginstal paket lama dan gagal dengan "Kesalahan input / output; apakah Anda menggunakan GCC dengan file header mesin lain?".
Tobu
0
Anda sekarang dapat menggunakan procdump dari SysInternals suite di Linux:
Jika Anda ingin membuang segmen memori terpisah dari proses yang berjalan tanpa membuat file inti besar (katakanlah dengan gcore), Anda dapat menggunakan alat kecil dari sini . Ada juga satu liner di README jika Anda ingin membuang semua segmen yang dapat dibaca ke dalam file terpisah.
/proc/$pid/mem
.Jawaban:
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 tolong beri tahu saya), tetapi yang berikut ini berfungsi untuk satu batch memori dengan asumsi Anda tahu pid:
Ini akan dalam format (contoh):
Pilih satu batch memori (jadi misalnya 00621000-00622000) kemudian gunakan gdb sebagai root untuk melampirkan ke proses dan membuang memori itu:
Kemudian menganalisis / root / output dengan perintah string, semakin sedikit Anda ingin Putty seluruh layar Anda.
sumber
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
letakkan ini dalam file (mis. "dump-all-memory-of-pid.sh") dan membuatnya dapat dieksekusi
pemakaian:
./dump-all-memory-of-pid.sh [pid]
Output dicetak ke file dengan nama:
pid-startaddress-stopaddress.dump
Ketergantungan:
gdb
sumber
rw-p
izin?rw-p
), rentang lain untuk kode (r-xp
). Jika Anda ingin dump keduanya, maka maju dan tukargrep
misalnyacat
.mencoba
di mana
$pid
jumlah aktual pid; untuk info lebih lanjut lihat:info gcore
mungkin memerlukan beberapa waktu agar dump terjadi, dan beberapa memori mungkin tidak dapat dibaca, tetapi cukup bagus ... perlu diketahui juga bahwa itu dapat membuat file besar, saya baru saja membuat file 2GB seperti itu ..
sumber
gcore
membuang file jarang?man proc mengatakan:
Mungkin itu bisa membantu Anda
sumber
Saya membuat program saya sendiri untuk membuang seluruh memori proses juga, itu dalam C sehingga dapat dikompilasi silang ke Android, yang saya butuhkan.
Anda juga dapat menentukan alamat IP dan port tcp. Kode sumber di sini .
sumber
Solusi bash murni:
Penggunaan: PID procdump
untuk dump bersih:
sumber
getconf PAGESIZE
digunakan untuk mendapatkan ukuran halaman dan kemudian alamat dan jumlah dibagi dengan itu.Alat untuk membuang proses ke output standar, pcat / memdump:
sumber
Anda sekarang dapat menggunakan procdump dari SysInternals suite di Linux:
https://github.com/Microsoft/ProcDump-for-Linux
sumber
Jika Anda ingin membuang segmen memori terpisah dari proses yang berjalan tanpa membuat file inti besar (katakanlah dengan gcore), Anda dapat menggunakan alat kecil dari sini . Ada juga satu liner di README jika Anda ingin membuang semua segmen yang dapat dibaca ke dalam file terpisah.
sumber