Não tenho certeza de como você despeja toda a memória em um arquivo sem fazer isso repetidamente (se alguém souber uma maneira automatizada de obter o gdb, informe-me), mas o seguinte funciona para qualquer lote de memória, desde que você saiba o pid:
Impressionante! Apenas usei para descobrir qual script uma instância misteriosa do bash estava executando.
26416 Tobia
Por que você está apenas aguardando e diminuindo intervalos com rw-ppermissões?
mxmlnkn
@mxmlnkn São dados ( rw-p), os outros intervalos são para código ( r-xp). Se você quiser um despejo de ambos, vá em frente e troque greppor exemplo cat.
A. Nilsson
39
experimentar
gcore $pid
onde $pidé o número real do pid; para mais informações, consulte:info gcore
pode levar algum tempo para que o despejo aconteça, e alguma memória pode não ser legível, mas é boa o suficiente ... esteja ciente também de que ele pode criar arquivos grandes, acabei de criar um arquivo de 2 GB dessa maneira ..
Isso não é suficiente, ler outro processo precisa de uma combinação de / proc / <pid> / {mem, * maps}, ptrace e algum tratamento de sinal para evitar travar o processo de destino.
Eu criei meu próprio programa para despejar toda a memória do processo, ela está em C para que possa ser compilada em conjunto com o Android, que é o que eu precisava.
Você também pode especificar o endereço IP e a porta TCP. Código fonte aqui .
Portanto, pelo que entendi, a idéia por trás do despejo mais limpo é que apenas os arquivos na memória têm um tamanho anexado à região da memória, em contraste com a memória real do aplicativo, que possui o tamanho 0 (já que o tamanho realmente usado é desconhecido pelo OS).
mxmlnkn
Um problema que tenho com esse script é que o tamanho de bloco de 1 leva a uma largura de banda inaceitavelmente lenta de ~ 30kB / s, em comparação com o uso de um tamanho de bloco igual ao tamanho da página (4096 para mim) para o qual recebo ~ 100MB / s! Veja aqui . getconf PAGESIZEé usado para obter o tamanho da página e, em seguida, os endereços e as contagens são divididos por ela.
mxmlnkn
1
Ferramenta para despejar o processo na saída padrão, pcat / memdump:
Este é obsoleto (removido a pedido do mantenedor); De qualquer maneira, instalei o pacote antigo e ele falhou com "Erro de entrada / saída; você usou o GCC com os arquivos de cabeçalho de outra máquina?".
Tobu
0
Agora você pode usar o procdump do conjunto SysInternals no Linux:
Se você deseja despejar um segmento de memória separado do processo em execução sem criar um arquivo principal enorme (por exemplo, com gcore), você pode usar uma pequena ferramenta a partir daqui . Há também uma linha no README, se você deseja despejar todos os segmentos legíveis em arquivos separados.
/proc/$pid/mem
.Respostas:
Não tenho certeza de como você despeja toda a memória em um arquivo sem fazer isso repetidamente (se alguém souber uma maneira automatizada de obter o gdb, informe-me), mas o seguinte funciona para qualquer lote de memória, desde que você saiba o pid:
Isso estará no formato (exemplo):
Escolha um lote de memória (por exemplo, 00621000-00622000) e use gdb como root para se conectar ao processo e despejar essa memória:
Em seguida, analise / root / output com o comando strings, a menos que você queira o PuTTY em toda a tela.
fonte
Eu criei um script que realiza essa tarefa.
A idéia vem da resposta de James Lawrie e deste post: http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195
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
fonte
rw-p
permissões?rw-p
), os outros intervalos são para código (r-xp
). Se você quiser um despejo de ambos, vá em frente e troquegrep
por exemplocat
.experimentar
onde
$pid
é o número real do pid; para mais informações, consulte:info gcore
pode levar algum tempo para que o despejo aconteça, e alguma memória pode não ser legível, mas é boa o suficiente ... esteja ciente também de que ele pode criar arquivos grandes, acabei de criar um arquivo de 2 GB dessa maneira ..
fonte
gcore
despejando um arquivo esparso?man proc diz:
Talvez possa ajudá-lo
fonte
Eu criei meu próprio programa para despejar toda a memória do processo, ela está em C para que possa ser compilada em conjunto com o Android, que é o que eu precisava.
Você também pode especificar o endereço IP e a porta TCP. Código fonte aqui .
fonte
Solução de bash pura:
Uso: procdump PID
para um despejo mais limpo:
fonte
getconf PAGESIZE
é usado para obter o tamanho da página e, em seguida, os endereços e as contagens são divididos por ela.Ferramenta para despejar o processo na saída padrão, pcat / memdump:
fonte
Agora você pode usar o procdump do conjunto SysInternals no Linux:
https://github.com/Microsoft/ProcDump-for-Linux
fonte
Se você deseja despejar um segmento de memória separado do processo em execução sem criar um arquivo principal enorme (por exemplo, com gcore), você pode usar uma pequena ferramenta a partir daqui . Há também uma linha no README, se você deseja despejar todos os segmentos legíveis em arquivos separados.
fonte