Assista a um local de memória / instalar o 'ponto de interrupção de dados' a partir do código?

StackOverflow https://stackoverflow.com/questions/1689019

Pergunta

Temos um problema substituição de memória. Em algum momento, durante o curso de nosso programa, um local de memória está sendo substituído e fazendo com que o nosso programa de acidente. o problema acontece apenas no modo de versão. quando na depuração, está tudo bem. que é um clássico C / C ++ erro, e um muito difícil de localizar.

Gostaria de saber se há uma maneira de adicionar um pouco de 'código de depuração', que irá assistir a este local de memória e vai chamar um callback uma vez que sua mudado. Este é basicamente o que um depurador poderia fazer no modo de depuração (um 'ponto de interrupção de dados') mas precisamos de algo semelhante no lançamento.

Foi útil?

Solução

Se você pode controlar a localização da variável, então você pode alocá-lo em uma página dedicada e definir as permissões de página para permitir que lê apenas usando VirtualProtect (no Windows ... não tenho certeza para Linux).

Desta forma, você vai ter uma violação de acesso quando alguém tenta escrever para ele. Com uma função de tradutor exceção que você pode tratar isso como uma chamada de retorno.

Mesmo que você não pode mover a variável diretamente (por exemplo., É um membro da classe), talvez você poderia adicionar preenchimento suficiente ao redor da variável para garantir que ele está em uma página dedicada e usar a mesma abordagem.

Outras dicas

Você ainda pode gerar símbolos de depuração para uma parte "release" do código. Isso ainda pode ser executado através de um depurador assim como você faria no modo "debug".

Recentemente, fiz algo semelhante com um de nossos motoristas de libertação, para que pudéssemos executá-lo através VTune. Para o Microsfot Link, eu adicionei a bandeira -DEBUG, para Microsoft CC eu adicionei -Zi. Tudo funciona bem. MSKB ligação

Você pode achar este link útil.

supondo que você estiver usando o Windows usar WinDbg para depurar o programa e confira o ba comando-isso vai quebrar quando a memória é acessada.

Existem ferramentas para isso - como agente de pilha e boundschecker e muitos outros que vão descobrir substituições. Basicamente, você precisa de algumas sentinelas no final de suas alocações de memória e eles precisam ser verificados.

APIs depuração são específicos da plataforma, mas eles existem. o Windows e APIs UNIX podem ser encontrados online.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top