Despeja a memória de um processo linux para arquivar

46

É possível despejar a memória atual alocada para um processo (por PID) em um arquivo? Ou lê-lo de alguma forma?

    
por Fragsworth 24.08.2010 / 19:44

7 respostas

41

Não tenho certeza de como você despeja toda a memória em um arquivo sem fazer isso repetidamente (se alguém souber uma forma automatizada de obter o gdb para fazer isso, avise-me), mas o seguinte funciona para qualquer lote de memória supondo que você conhece o pid:

$ cat /proc/[pid]/maps

Isso estará no formato (exemplo):

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

Escolha um lote de memória (por exemplo, 00621000-00622000) e use o gdb como root para anexar ao processo e despejar essa memória:

$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000

Em seguida, analise / root / output com o comando strings, menos você quer o PuTTY em toda a tela.

    
por 24.08.2010 / 20:39
42

Eu fiz um script que realiza essa tarefa.

A ideia vem da resposta de James Lawrie e deste post: link

#!/bin/bash

grep rw-p /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/ /p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done

coloque isso em um arquivo (por exemplo, "dump-all-memory-of-pid.sh") e torne-o executável

uso: ./dump-all-memory-of-pid.sh [pid]

A saída é impressa em arquivos com os nomes: pid-startaddress-stopaddress.dump

Dependências: gdb

    
por 18.07.2012 / 19:38
34

tente

    gcore $pid

onde $pid é o número real do pid; Para mais informações, consulte: info gcore

pode levar algum tempo para o despejo acontecer, e alguma memória pode não ser legível, mas é boa o suficiente ... esteja ciente também que ela pode criar arquivos grandes, eu acabei de criar um arquivo de 2GB dessa maneira.

    
por 09.03.2013 / 20:06
3

man proc diz:

/proc/[pid]/mem This file can be used to access the pages of a process's memory through open(2), read(2), and lseek(2).

Talvez isso possa ajudar você

    
por 24.08.2010 / 19:58
2

Eu fiz o meu próprio programa para descarregar toda a memória do processo também, está em C para que possa ser compilada para o Android, que é o que eu precisava.

Você também pode especificar o endereço IP e a porta tcp. Código-fonte aqui .

    
por 27.12.2015 / 15:55
1

Ferramenta para despejar o processo na saída padrão, pcat / memdump:

por 04.02.2013 / 22:27
0

Agora você pode usar o procdump da suíte SysInternals no Linux:

link

    
por 07.12.2017 / 08:09