Memory dump

Um despejo de memória é um instantâneo dos dados armazenados na memória de um computador em um determinado momento. O conteúdo de um despejo de memória pode ser muito útil quando se tenta depurar um programa de computador, pois pode fornecer uma imagem clara do que o programa estava fazendo no momento em que o despejo foi feito.

Existem vários tipos diferentes de despejos de memória, mas o mais comum é o despejo do núcleo. Um despejo do núcleo é criado quando o sistema operacional detecta um erro grave e deve terminar o programa. O sistema operacional então grava o conteúdo da memória em um arquivo, que pode ser posteriormente analisado por um programador.

Outros tipos de despejos de memória incluem despejos de processo e despejos de thread. Um despejo de processo contém um instantâneo dos dados armazenados na memória para um processo específico, enquanto que um despejo de thread contém um instantâneo dos dados armazenados na memória para um thread específico. Como faço para despejar arquivos? Existem algumas maneiras diferentes de despejar arquivos, dependendo do que você está procurando alcançar.

Se você quiser apenas criar um backup de um arquivo ou diretório, você pode usar o comando cp. Por exemplo, para copiar um arquivo chamado file.txt, você usaria o seguinte comando:

cp file.txt file.txt.bak

Se você quiser criar uma réplica exata de um arquivo ou diretório, você pode usar o comando dd. Por exemplo, para copiar um arquivo chamado file.txt, você usaria o seguinte comando:

dd if=file.txt of=file.txt.copy

Se quiseres despejar o conteúdo de um ficheiro para o ecrã, podes usar o comando cat. Por exemplo, para despejar o conteúdo de um arquivo chamado file.txt, você usaria o seguinte comando:

cat file.txt

Se quiser descarregar o conteúdo de um ficheiro para uma impressora, pode usar o comando lpr. Por exemplo, para imprimir o conteúdo de um arquivo chamado file.txt, você usaria o seguinte comando:

lpr file.txt

O que causa o despejo de memória?

Existem muitas causas para um despejo de memória. Um despejo de memória é normalmente causado por um bug de software ou por um problema de hardware.

Uma causa comum para um despejo de memória induzido por software é um buffer overflow. Isto ocorre quando um programa tenta gravar mais dados em um buffer do que o buffer pode conter. Isto pode corromper outras partes da memória, levando a um travamento.

Outra causa comum de despejos de memória é quando um programa tenta acessar um pedaço de memória que não existe. Isto pode acontecer se um programa estiver tentando acessar uma região de memória que não foi alocada a ele. Isto também pode acontecer se um pedaço de hardware não estiver funcionando corretamente e estiver retornando dados de lixo.

Os despejos de memória também podem ser causados por problemas de hardware, tais como um módulo de memória defeituoso. Se um módulo de memória não estiver a funcionar correctamente, pode causar a falha do sistema.

Em geral, um despejo de memória é causado ou por um bug de software ou por um problema de hardware.

Que despejo de memória devo usar?

Existem alguns tipos diferentes de despejos de memória que você pode usar, dependendo do que você precisa para depurar.

O tipo mais comum de despejo de memória é um despejo de memória completa. Este despejo contém todos os dados que estavam na memória física no momento do acidente. Este é o tipo mais completo de despejo de memória, mas também pode ser o maior, portanto nem sempre é prático coletar um despejo de memória completa.

Outro tipo de despejo de memória é um mini despejo de memória. Este despejo contém apenas um pequeno subconjunto dos dados da memória física, mas pode ser muito menor do que um despejo de memória completa. Isto pode ser útil quando você precisa coletar um despejo de memória de uma máquina remota ou quando a máquina tem espaço de armazenamento limitado.

Um despejo de memória do kernel contém apenas os dados da memória do kernel. Isto pode ser útil se você só estiver interessado em depurar problemas ao nível do kernel.
Finalmente, um pequeno despejo de memória (também chamado de crash dump) contém apenas os dados necessários para recriar o estado da máquina no momento do crash. Isto pode ser útil se você quiser coletar um despejo de memória de uma máquina que não esteja rodando Windows.

Como eu vejo um dump de memória do Windows?

Para ver um despejo de memória do Windows, você precisará abrir o arquivo em um editor hexadecimal. Há muitos editores hexadecimais disponíveis, tanto gratuitos como comerciais. Uma vez que você tenha o arquivo aberto no editor hexadecimal, você precisará saber o que procurar.

Os despejos de memória do Windows contêm uma grande quantidade de informações sobre o que estava acontecendo no sistema no momento da falha. No entanto, podem ser difíceis de interpretar se você não souber o que está procurando. Há algumas coisas importantes a procurar:
A primeira coisa a procurar é o selo "Tempo de Crash". Esta é a hora em que o sistema falhou, e pode ser usada para ajudar a determinar o que estava acontecendo no momento do acidente.
Em seguida, você vai querer procurar o "Código de Exceção" e o "Offset de Exceção". O Código de Exceção é o código que estava sendo executado no momento da falha, e o "Exception Offset" é o endereço desse código. Estes dois valores podem ajudá-lo a determinar o que correu mal e porque é que o sistema falhou.

Finalmente, você vai querer procurar pela seção "Memory Dump". Esta secção contém um despejo da memória do sistema no momento da falha. Isto pode ser útil para determinar o que estava acontecendo no sistema no momento do travamento.

Posso apagar os despejos do crash? Sim, você pode apagar as descargas do crash, mas fazer isso pode evitar que você possa depurar seu programa se ele travar. Adicionalmente, se você estiver usando uma ferramenta de análise de crash dump, deletar crash dumps pode impedir que a ferramenta seja capaz de analisar corretamente o arquivo dump.