2009-07-01 16 views
6

Estamos obteniendo System.AccessViolationException no determinista arrojado desde el código nativo. Es difícil reproducirlo, pero a veces sucede. No estoy seguro de poder "depurarlo", ya que el tiempo necesario para la infracción de acceso es de aproximadamente 2 horas y no hay garantías de que se produzca una infracción de acceso.Determine el motivo de System.AccessViolationException

La biblioteca nativa es utilizada por los contenedores administrados. Se usa desde Java hasta JNI y se usa desde .NET a través de IKVM'ed JNI. El problema solo se reprodujo durante el código IKVM, pero los conjuntos de datos son diferentes y no hay forma de probar la aplicación Java con los datos utilizados por la aplicación IKVM.

Tengo fuentes para todo, pero (si es posible) quiero evitar hacer una gran cantidad de cambios.

Creo que la pila de llamadas nativa proporcionará suficiente información sobre el motivo de esta infracción de acceso.

¿Hay alguna forma efectiva de determinar el motivo de esta infracción de acceso?

Creo que la solución ideal para mí son algunos cambios en el código o entorno de proceso, por lo que se bloqueará con el volcado de memoria en caso de esta violación de acceso, por lo que puedo hacer esos cambios y esperar.

Respuesta

2

Si puede permitirse esperar a que ocurra la excepción, adjunte el depurador administrado y nativo (sesión de depuración mixta) y configure el depurador administrado para que se rompa cuando se genere un AccessViolationException. El depurador administrado interrumpirá el proceso cuando detecte la excepción no controlada, y usted debería poder ver la pila de llamadas nativa.

+0

Hm. Cambié mi código nativo por lo que seguramente tiene una infracción de acceso y lo recompila con símbolos de depuración. Cuando comencé el proceso normalmente y adjunté el depurador de Visual Studio. Agregué un punto de interrupción para arrojar AccessViolationException, pero no fue atrapado. ¿Alguna sugerencia? – okutane

+1

OK, me parece que el punto de interrupción debería ser una violación de acceso Win32. – okutane

Cuestiones relacionadas