2012-08-25 26 views
7

¿Cuál es la diferencia entre el modo de lanzamiento y el modo de depuración?¿Por qué mi aplicación falla en modo de lanzamiento pero no en modo de depuración?

¿Y cómo puedo depurar en modo de lanzamiento para ver qué falla?

class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     try 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainWindow()); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Main : "+ex.Message, typeof(Program)); 
      MessageBox.Show(ex.Message + ex.StackTrace); 
      Environment.Exit(1); 
     } 
    } 
} 

Respuesta

7

La cláusula de captura en su fragmento nunca captará nada en la versión de envío de su aplicación. Es funciona cuando lo ejecuta con un depurador conectado.

Lo que hace falta es la forma en que se comporta Application.ThreadException. Ese evento se dispara cada vez que se detecta una excepción no controlada. Sin embargo, esta característica está habilitada para al depurar el código. No se instaló ningún manejador de excepciones para levantar el evento. Esto se hizo para que tenga una forma decente de depurar excepciones no controladas. Su código cambia ese comportamiento, ahora hay es un bloque de prueba activo, su controlador de captura recibe la excepción.

Para que el código se comporte de la misma manera, deberá cambiar la estrategia de manejo de excepciones no controladas. De esta manera:

[STAThread] 
    static void Main() { 
     try { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
      Application.Run(new Form1()); 
     } 
     catch (Exception ex) { 
      // etc.. 
     } 
    } 

Ahora su cláusula catch siempre tendrá la excepción. Siempre que se genere en el hilo principal, no detectará las excepciones planteadas en los hilos de trabajo. Considere este código en su lugar para el manejo unificado:

[STAThread] 
    static void Main() { 
     AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions; 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
     Application.Run(new Form1()); 
    } 

    private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) { 
     var ex = (Exception)e.ExceptionObject; 
     // Display or log ex.ToString() 
     //... 
     Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex)); 
    } 
+0

gracias por su gran consejo – armin

+0

¿Funciona esto en WPF o solo en Windows Forms? –

2

Hay muchos razones por las que podría suceder, y muchos profesionales podrían confirmar que esto es un clásico fallo de cualquier aplicación, que aparece cuando se está seguro Wrks todo bien, pero en la máquina cliente no funciona nada

Es muy difícil decir por qué sucede esto sin ningún detalle de excepción proporcionado en la pregunta.

Por cierto puede depurar su aplicación adjuntándola desde Visual Studio.

How to: Attach to a Running Process

+0

Gracias por su respuesta, pero se puede explicar por qué mi código anterior no incluso detectar esta excepción sólo se bloquea, no hay excepciones, los cuadros de mensajes o cualquier – armin

+0

@armin lo hace? EventViewer dice? –

+1

Bueno, hay tipos de excepciones que no pueden ser caugth por 'try/catch', como' StackOverflow' por ejemplo. Mire en 'EventViewer', como sugiere LB, o [Habilite las excepciones de primera oportunidad] (http://florianreischl.blogspot.it/2010/01/how-to-enable-first-chance-exceptions.html) para ver dónde y lo que pasa. – Tigran

0

depuración y liberación modos son dos formas diferentes de construir su código. Dado que las formas específicas difieren en casi todos los entornos de desarrollo que utiliza, es imposible saberlo de inmediato. Los modos también podrían llamarse Mode1 & Mode2.

Sin embargo, su modo de depuración probablemente compila información de depuración (tablas de símbolos, numeración de líneas, etc.) en su binario donde no lo hace la versión. Pero puede haber miles de diferencias.

¡Intenta encontrar dónde se especifican los modos de depuración/liberación y encontrarás las diferencias!

0

La mejor manera de encontrar cualquier opción ambiental es registrar lo que está sucediendo en la producción. Comience capturando y registrando excepciones, luego use lo que aprenda para un registro más específico.

Consulte this Microsoft kb article para obtener instrucciones.

En cuanto a las ideas detrás de la versión y de depuración modos:

modo de disparo y el modo de depuración existen que permitan diferentes configuraciones, un diseño para ayudar a los desarrolladores a encontrar los fallos, el otro para optimizar el rendimiento, y para configurar para la producción ambiente.

La mejor manera de conocer la diferencia es simplemente abrir las propiedades de compilación de su proyecto (haga clic con el botón derecho en su proyecto, seleccione Propiedades, luego haga clic en la pestaña Construir a la izquierda). Mire todas las diferentes opciones que pueden cambiar en función de la Configuración.

Otro problema común con la depuración frente a la versión no es establecer la Build Action correcta en uno de los elementos del proyecto, como un archivo de configuración o un recurso incrustado.

2

Mi experiencia me dice que debe buscar código donde maneje configuraciones de cualquier tipo.

Puede comenzar depurando la aplicación sin configuraciones en el registro y sin configuraciones en application.config.

Si su aplicación utiliza una base de datos, debe probarla con una base de datos vacía también.

El segundo paso sería depurar su aplicación en una computadora de su colega.

Espero que esto ayude a su búsqueda.

Cuestiones relacionadas