solucion que punto problemas problema posible para inalámbrico inalambrico haya funciona esta detecta controlador conectado con adaptador acceso windows-mobile compact-framework access-violation

que - ¿Cuáles son algunas técnicas para solucionar problemas de infracción de acceso muy intermitente en un dispositivo con Windows Mobile?



windows 10 no detecta adaptador de red (2)

A 0xC0000005 es una infracción de acceso, por lo que algo está intentando leer o escribir en una dirección a la que no tiene derechos de acceso. Estos tienden a ser muy difíciles de encontrar y la experiencia es una de las mejores herramientas (además, el depurador de Platform Builder es realmente útil, pero eso es una vía de depuración completamente independiente y requiere experiencia que probablemente no tenga o que ya tenga lo intenté). Encuentro que el registro tiende a ser menos útil que la codificación sustractiva, eliminando llamadas P / invoke con llamadas administradas simuladas siempre que sea posible.

Las infracciones de acceso en las aplicaciones administradas suelen ocurrir por una de estas razones:

  • Usted P / Invoca una API nativa que pasa un identificador a un objeto administrado y la API nativa usa ese identificador. Si obtiene una recopilación y compactación mientras se ejecuta la API nativa, el objeto administrado se puede mover y el puntero deja de ser válido.
  • Usted P / Invoca algo con un búfer que es demasiado pequeño o más pequeño que el tamaño que pasa y la API sobrepasa una lectura o escritura
  • Un puntero (IntPtr, etc.) que pase a una llamada de P / Invoke no es válido (-1 o 0) y el nativo no lo está verificando antes de usarlo.
  • Usted P / Invoca una llamada nativa y el código nativo se queda sin memoria (generalmente virtual) y no está verificando las asignaciones fallidas y las lecturas / escrituras en una dirección no válida
  • Utiliza un GCHandle que no está inicializado o que de alguna manera apunta a un objeto ya finalizado y recopilado (por lo que no apunta a un objeto, apunta a una dirección donde solía estar el objeto)
  • Su aplicación utiliza un control para algo que quedó invalidado por un sueño / vigilia. Esto es más esotérico, pero ciertamente sucede. Por ejemplo, si está ejecutando una aplicación fuera de una tarjeta de almacenamiento, toda la aplicación no se carga en la memoria RAM. Las piezas en uso tienen una paginación de demanda para su ejecución. Esto está todo bien. Ahora, si apaga el dispositivo, todos los controladores se apagan. Cuando se vuelve a encender, muchos dispositivos simplemente vuelven a montar los dispositivos de almacenamiento. Cuando su aplicación necesita una página de demanda en más programas, ya no está donde estaba y muere. Un comportamiento similar puede ocurrir con bases de datos en tiendas montadas. Si tiene un controlador abierto para la base de datos, después de un ciclo de suspensión / activación, el identificador de conexión puede dejar de ser válido.

Observará la tendencia aquí que casi todos estos son P / Invocaciones y eso no es accidental. Es bastante difícil obtener código administrado para hacer esto por sí mismo.

Tengo una gran aplicación Compact Frameworks V2.0 que en la mayoría de los casos funciona muy bien. En ciertos dispositivos, aproximadamente una vez al día, un usuario recibe un Error nativo 0xC0000005 que no se detecta con el bloque Try / Catch estándar administrado.

Mi aplicación se sincroniza con el servidor a través de llamadas ASMX a intervalos fijos. El problema parece ocurrir durante la sincronización. Existe una lógica comercial considerable además de la llamada ASMX que ocurre en el momento de la sincronización, pero el 98% de eso es código administrado. He revisado todas mis P / Invokes y las bibliotecas nativas de C ++ de las aplicaciones y en este momento estoy aproximadamente un 95% seguro de que no es donde está el problema.

Dado que esto solo ocurre en ciertos dispositivos y con poca frecuencia (menos de una vez al día) es muy difícil aislarlo. He inserido mi código y parece que sucede en lugares aleatorios dentro de la aplicación, así que sospecho que algo está corrompiendo la memoria.

Cualquier idea sobre cómo solucionar este problema será apreciada.


Mi manejo nativo de excepciones C ++ no incluía la excepción asíncrona y, por lo tanto, no detectaba excepciones a la infracción de acceso.

Esto puede / no ser útil para mi problema, pero puede ser útil para otros.

El uso del modificador / EHa como se documenta en este enlace permitirá detectar este tipo de excepciones:

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