Quais são algumas técnicas para a solução de problemas de violação de acesso muito intermitente em um dispositivo Windows Mobile?

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

Pergunta

Eu tenho um aplicativo grande Compact Frameworks V2.0 que na maioria dos casos funciona muito bem. Em determinados dispositivos cerca de uma vez por dia, um usuário recebe um erro nativo 0xC0000005 que não seja pego com o bloco try / catch conseguiu padrão.

Meu aplicativo sincroniza com o servidor via ASMX chama em intervalos fixos. O problema parece ocorrer durante a sincronização. Há uma lógica de negócio considerável para além da chamada ASMX que acontece no momento da sincronização, mas 98% do que é o código gerenciado. Eu revi todos os meus invoca e as aplicações bibliotecas P / C ++ nativo e neste momento eu sou cerca de 95% de certeza que não é onde está o problema.

Uma vez que isso só acontece em determinados dispositivos e muito raramente (menos de uma vez por dia) é muito difícil de isolar. Eu instruemented meu código e ele aparece como se isso acontece em lugares aleatórios dentro do aplicativo, então eu suspeito que algo está corrompendo a memória.

Quaisquer pensamentos sobre como solucionar esse ainda seria apreciada.

Foi útil?

Solução 2

Meu tratamento de exceção nativo C ++ não foi incluindo exceção assíncrona, e, portanto, não estava pegando acesso exceções violação.

Esta pode / não pode ser útil para o meu problema, mas pode ser útil para os outros.

Usando o parâmetro / EHa como documentado neste link irá permitir a captura destes tipos de exceções:

http://msdn.microsoft.com/en-us/library /1deeycx5.aspx

Outras dicas

A 0xC0000005 é uma violação de acesso, assim que algo está tentando ler ou escrever para um endereço que ele não tem direitos de acesso. Estes tendem a ser muito difícil de encontrar e experiência é uma das melhores ferramentas (depurador do bem Platform Builder é realmente útil também, mas isso é uma avenida inteira separada de depuração e requer experiência que você provavelmente não tem ou você já teria tentou fazê-lo). Acho que a exploração madeireira tende a ser menos útil que subtrativo de codificação - remoção de P / Invoke chamadas com simulados conseguiu chamadas sempre que possível

.

Violações de acesso em aplicativos gerenciados normalmente acontecer por uma dessas razões:

  • Você P / Invoke uma API nativa passando um identificador para um objeto gerenciado e os usos da API nativa que alça. Se você receber uma coleta e compactação enquanto a API nativa está em execução, o objeto gerenciado pode se mover e o ponteiro se torna inválida.
  • Você P / Invoke algo com um tampão que é demasiado pequena ou menor do que o tamanho que você passa e as derrapagens API de leitura ou de escrita
  • Um ponteiro (IntPtr, etc) que você passar para um P / chamada Invoke é inválido (-1 ou 0) e o nativo não está verificando-lo antes de usar
  • Você P / Invoke uma chamada nativa e o código nativo é executado fora de memória (geralmente virtual) e não está verificando para alocações falharam e lê / escreve para um endereço inválido
  • Você usa um GCHandle que não é inicializado ou que de alguma forma está apontando para um objeto já finalizado e coletado (por isso não está apontando para um objeto, ele está apontando para um endereço onde um objeto usado para ser)
  • O seu aplicativo usa um identificador para algo que foi invalidada por um sono / vigília. Esta é mais esotérico, mas certamente acontece. Por exemplo, se você estiver executando uma aplicação off de um cartão de memória, o aplicativo inteiro não é carregado na memória RAM. Pieces em uso está em execução paginada por demanda. Está tudo bem e bom. Agora, se você alimentar o off dispositivo, os drivers de todos fechados. Quando você poder fazer backup, muitos dispositivos simplesmente re-montar os dispositivos de armazenamento. Quando seu aplicativo precisa exigir páginas em mais programa, ele não é mais onde estava e ele morre. Comportamento semelhante pode acontecer com bases de dados em lojas montados. Se você tiver um identificador aberto para o banco de dados, depois de um ciclo de sono / vigília o identificador de conexão pode não ser mais válido.

Você vai notar a tendência aqui que quase todos estes são P / invoca e que não é por acaso. É muito difícil conseguir código gerenciado para fazer isso por conta própria.

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