2010-10-25 8 views
5

tengo una aplicación que funciona muy bien en la versión de depuración, pero cuando lo inicio en la versión de lanzamiento, consigo unqué hacer en caso de depuración funciona muy bien, pero la autorización accidentes

unhandled Exception at 0x0043b134 in myapp.exe: 0xC0000005: 
Access violation while reading at position 0x004bd96c 

si hago clic en 'break' me dice que no hay símbolos cargados y que no se puede mostrar el código fuente.

¿Qué puedo hacer en una situación tal para rastrear el problema?

+0

Esto a veces se produce debido a problemas de memoria. A menudo, las compilaciones de lanzamiento son menos permisivas en esta área. ¿Podría su programa tener fugas de memoria, problemas de desbordamiento de búfer, etc.? – Cam

+0

¿qué tipo de problemas de memoria? – Mat

+1

Parece que ha eliminado algo, pero intente usarlo. ¿Hay alguna forma de publicar un código? No podemos hacer nada si no nos dices lo que estás haciendo. – GManNickG

Respuesta

3

Podría ser dos cosas:

  • uno o más de sus afirmaciones no trabajo necesario aparte del propio cheque
  • Algo más

para descartar el primero, intentar redefinir assert como una operación vacía en la compilación de depuración. Si la ausencia de alguna afirmación causa el bloqueo, lo verá. De lo contrario, es algo más.

Además, supongo que tiene control de versión. ¿Esto comenzó a pasar? Puede analizar los cambios de código de la semana pasada.

Finalmente, incluso en ausencia de un bloqueo en el modo de depuración, ejecutar una herramienta de corrector de memoria puede ser útil para detectar el acceso incorrecto a la memoria.

+0

+1 para la sugerencia de control de versión. – Zooba

+0

Uso el control de control de versiones para todos mis proyectos, excepto para ese, ya que esta máquina en particular en la que estoy desarrollando no está conectada a Internet:/tonto ... redefiní la afirmación para no hacer nada y no falla en la compilación de depuración. Voy a googlear la 'herramienta del corrector de memoria' - ¿me pueden recomendar una? – Mat

+0

@Mat: Considere también la sugerencia de @ Grozz de utilizar la salida de registro. Esto ciertamente le dará un poco de luz. –

10

Este tipo de problema a menudo se debe a variables unitarias. Comenzaría allí buscando tu problema.

El modo de depuración es más tolerante porque a menudo se configura para inicializar variables que no se han inicializado explícitamente.

Quizás esté eliminando un puntero unitario. En el modo de depuración, funciona porque el puntero fue nulled y delete ptr estará bien en NULL. En el lanzamiento es un poco de basura, luego eliminar ptr en realidad causará un problema.

+0

¡eso suena razonable! ¿Puedo decirle a Visual Studio que no inicialice las variables en la compilación de depuración? – Mat

+0

He activado/RTCu (variables no inicializadas) en mi compilación de depuración, ¿no debería molestar si hubiera variables sin inicializar? – Mat

+0

sí en la mayoría de los casos, pero no en todos los casos. Si un puntero podría haberse inicializado por otros medios, esta verificación se ignora. En la práctica, es posible que haya utilizado el operador address-of & y haya inicializado la variable mediante un puntero. Por lo tanto, aún podría faltar una inicialización y no producir una advertencia. Ver http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx – Montdidier

1

Localice el problema insertando salida de registro aquí y allá desde el comienzo de la función main.

1

Si no es un problema de memoria, entonces debe habilitar las afirmaciones en el lanzamiento. Para problemas de memoria, espero que tengas buenas pruebas unitarias. Puede detectar fácilmente estos problemas con valgrind.

btw ¿Por qué las personas inutilizan afirmaciones en la versión de lanzamiento? En el 99% de los casos, no causan problemas de rendimiento y son buenos para detectar errores.

0

Realice un volcado de emergencia usando Microsoft debugdiag en Windows (es gratis) y analice el volcado utilizando el mismo. Da una buena pila de llamadas para la función donde se bloquea. Aunque, si sigue fallando por todos lados, podría ser un problema de corrupción en el montón. Luego debe usar indicadores globales (o gflags, que es parte de las herramientas de Microsoft para depurar suite que es gratis) junto con debugdiag. Gflags le daría la ubicación donde el montón realmente se corrompe. Espero que ayude.

0

Sin mirar el código, es difícil distinguir qué está mal. Todas las sugerencias anteriores son buenas y útiles, pero lo que he encontrado más útil para solucionar este tipo de cosas es ejecutar ciertas partes del programa en fragmentos. es decir, comentar un montón de código/funcionalidad y luego ejecutar el programa y ver si falla. Si no es así, elimine el comentario de alguna funcionalidad y vuelva a ejecutarla, y así sucesivamente. De esta forma, podrá reducir el problema al código exacto que está causando esto.

En la mayoría de los casos, esto sucede debido a algunas sobrecargas de búfer que las compilaciones de depuración pueden evitar.

2

Dos pasos:

a) Liberación Construir Construir con depuración símbolos (es posible con VS al menos)

b) versión de lanzamiento construir sin optimización

Si el el problema aún sucede, es muy bueno y fácil de arreglar. Es casi como si el problema estuviera en la construcción de depuración.

Si el problema ocurre con las configuraciones de optimización activadas, entonces es realmente difícil y debe manejarse de una manera específica.

+0

si construyo la versión con símbolos de depuración, no se cuelga – Mat

+0

@Mat: eso es _muy_ raro, ya que el binario debería (para todos los propósitos) ser idénticos. La principal diferencia es que la opción "símbolos de depuración" crea un archivo .PDB separado que describe la relación entre las direcciones de memoria y las funciones/variables. Es decir. eso debería decirle lo que estaba en la dirección '0x0043b134' o la dirección' 0x004bd96c'. – MSalters

+0

@MSalters: Creo que la razón es que los archivos binarios de publicación siempre se crean con alguna optimización (/ O2, por ejemplo). Sospecho que tiene que ver con los indicadores de optimización. – Chubsdad

1

Tuve este problema, la versión/depuración funcionó bien dentro del estudio visual, el trabajo de depuración fue solo, pero el lanzamiento se colgó solo. La depuración no fue particularmente precisa para mí, mi solución fue:

Comente la mayor parte del código, luego compilación, prueba, descomente, repita, hasta encontrar la sección que causa el bloqueo.

En mi caso, estaba pasando un puntero a una matriz que era demasiado pequeña para una función.

1

¿Estás seguro de que ambas versiones usan el mismo .dll? Paso una hora preguntándome por qué mi programa se compiló en modo de depuración pero no en modo de lanzamiento y me olvidé de actualizar el dll en la carpeta de lanzamiento.

0

Para mí, el problema era que un constructor estaba inicializando 2 variables miembro en el orden incorrecto. es decir, no en el mismo orden en el que se declararon.
Me sorprende que la orden de inicialización realmente marque la diferencia.

Cuestiones relacionadas