Como configurar o gdb para varrer a memória heap?

4

Eu quero imprimir e analisar o conteúdo do heap do sistema. Obviamente, essa deve ser uma operação privilegiada e pode ir contra o que o GDB pretendia fazer.

Especificamente, desejo varrer todo o heap de sistemas, e não apenas a parte de processos do heap.

Isso é possível com o gdb? Em caso afirmativo, quais comandos o fariam? Se não, existe uma ferramenta que pode fazer isso?

Estou disposto a configurar drivers personalizados / depurar kernal / breakpoints para fazer isso, se necessário.

    
por baordog 01.04.2015 / 19:19

1 resposta

6

Primeiro, você precisa entender os conceitos básicos da memória virtual . Você não precisa entender como funciona uma MMU, mas precisa entender o que é um espaço de endereço virtual e quando está lidando com endereços virtuais ou endereços físicos. Caso contrário, você não conseguirá entender o que vê.

No Linux, você pode acessar a memória física do sistema através de /dev/mem : byte N de /dev/mem é byte N na RAM ou em periféricos mapeados na memória. A menos que você já saiba o que está procurando e onde procurá-lo, será difícil encontrar coisas interessantes. O arquivo /proc/iomem descreve o que está mapeado no espaço de endereço físico (RAM e periféricos).

Você pode acessar a memória virtual do kernel via /dev/kmem : que dá acesso ao código do kernel e às estruturas de dados, e aos dispositivos atualmente mapeados no kernel, mas não para processar a memória. O Linux também possui /proc/kcore , que é semelhante a /dev/kmem , mas coloca um cabeçalho ELF no início, para facilitar a execução de um depurador no kernel. Um depurador pode abrir /proc/kcore e trabalhar nele da mesma forma que funcionaria na memória de um processo. Você pode depurar um kernel em execução executando gdb /path/to/vmlinux /proc/kcore (existem instalações mais convenientes, em particular para depuração remota).

Você pode acessar a memória virtual de um processo por meio de /proc/$PID/mem . O arquivo /proc/$PID/maps resume o que está mapeado no espaço de endereço do processo; /proc/$PID/smaps entra em mais detalhes.

Não existe um “heap do sistema” ou um “gerenciador de heap centralizado”. O mais próximo disso é toda a memória do sistema e o gerenciador de memória (todos ~ 100kLoC dele no Linux, não incluindo partes específicas da arquitetura).

    
por 02.04.2015 / 02:33

Tags