Cuando Debug no es igual a Release

¿ Usted cree en las brujas ? Hay algunos dias que me hago esa pregunta … 🙂

Les cuento de un error de por más interesante que me estaba dando una aplicación que lee y escribe datos intensivamente sobre una base de datos SQL Server y que me motivó a escribir esta entrada en mi blog.

Es un error súper extraño y gracioso a la vez. Antes que nada, mostremos el stack del error:

Stack Trace
   at System.Data.SqlClient.SqlTransaction.Zombie()
   at System.Data.SqlClient.SqlInternalTransaction.ZombieParent()
   at System.Data.SqlClient.SqlInternalTransaction.CloseFromConnection()
   at System.Data.SqlClient.TdsParser.Deactivate(Boolean connectionIsDoomed)
   at System.Data.SqlClient.SqlInternalConnectionTds.InternalDeactivate()
   at System.Data.SqlClient.SqlInternalConnection.Deactivate()

¿¿¿¿ System.Data.SqlClient.SqlTransaction.Zombie() ????
Pues sí, y sinceramente jamas habia visto este error ni nada parecido !!

Está bien que era sábado cerca de las 12 de la noche, pero el Zombie en ese caso debería ser yo y no tenía porque serlo ADO.Net, a no ser que las brujas existan…  🙂

Lo peor de todo esto es que este error sucedía solamente cuando compilaba mi aplicación en Release y no en Debug !
Con Debug funcionaba todo perfectamente tal cual estaba programado. 😦

En otro caso, aleatoriamente me daba: referencia no establecida a instancia de objeto.  Empecé entonces a revisar todo el proceso paso a paso para ver si mis objetos eran Thread Safe, si mis colecciones están trabajando correctamente, etc.. Pero como en Debug la aplicacion funcionaba correctamente era evidente que por mas que me pase horas y horas recorriendo paso a paso mi aplicacion no iba llegar al problema.
Busqué el error del “Zombie” en internet y prácticamente no encontré ninguna información acerca del mismo, y en la ayuda nada de nada…
Termine apagando mi equipo y me fui a hacer un poco de vida familiar antes de irme a dormir.

Hoy domingo mi pequeña hija me despertó tempranito y aproveche para ponerme a estudiar el misterioso caso del Zombie que tenía en mi Pc. 😛

Después de un par de horas de revisar mi código buscando sin éxito algún problema me puse a revisar las opciones de compilación de cada proyecto ya que era muy extraño que en Debug funcionara y en Release no.
Al fin encontré como solucionar el problema, y era que en Release, uno de mis ensambles tenía en la opción Generar Información de Depuración = None, mientras que otros tenían pdb-only.  En Debug esto es por defecto Full.

¿ Conclusión que saco ?

Hay que usar para todos los proyectos que forman parte una aplicación la misma configuración avanzada de compilación. Esto es: None para todos, ó pdb-only para todos, ó Full (Debug) para todos, ya que de lo contrario obtendremos resultados inesperados.

Bueno, con eso mi aplicación quedó andando (y muy rápido), pero si alguien me puede explicar este extraño comportamiento se lo agradeceré….

Aquí paso las ventanas tanto en Visual Basic como en C# de cómo cambiar esta configuración.

compilacion1.jpg

compilacion2.jpg

Anuncios

Un comentario Agrega el tuyo

  1. piru dice:

    Un poco tarde, pero a quien le pase lo mismo pasará por aquí.

    Según se comenta en el hilo que pongo abajo se trata de un bonito bug de ADO.Net que tiene “workaround”:

    http://ormapper.net/Forums/Default.aspx?part=74&action=thread&id=2450&key=IaC12zYu0ykFv3qP9v11Tg%3d%3d

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s