Como você colocar um ponto de interrupção em um local de memória em DBX?
-
20-08-2019 - |
Pergunta
Um colega de trabalho tem um programa C que não consegue de uma maneira previsível por causa de alguma memória corrompida. Ele gostaria de usar dbx
para monitorar a posição de memória uma vez que é alocado, a fim de identificar o código que faz com que a corrupção.
Isso é possível? Se assim o que é a sintaxe para produzir um ponto de interrupção no momento da corrupção?
Se não, o que seria uma boa abordagem para corrigir esse tipo de problema?
(A minha tática usual é de olhar para o controle de origem para ver o que eu mudei recentemente, uma vez que é geralmente a causa. Mas o código em sons pergunta como se ela só tenha trabalhado por sorte, de modo que não vai . trabalho Além disso, eu já me eliminado como o culpado por nunca ter trabalhado com o código; -).
Solução
Tendo olhado mais profundamente, parece que a solução em versões recentes do dbx
é algo como:
stop access w <address>, <size>
Desde <address>
e <size>
podem ser expressões, você pode escrever comandos como:
stop access w &p, sizeof(int)
Isso pressupõe p
é um ponteiro e queremos monitorar a primeira palavra que ele aponta.
Eu também funcionar através de uma multa tutorial no rastreamento e pisando erros de memória. Ele usa gdb
em vez de dbx
, mas os princípios devem ser os mesmos.
Outras dicas
No AIX, você quer usar stophwp:
(dbx) help stophwp
stophwp <address> <size>
Stop execution when the contents of the specified
memory region change. This is a accomplished in
hardware and may not be available on all models.
Eu não sou nenhum dev Solaris, mas você pode fazer isso com o GDB e hardware breakpoints