2010-03-04 16 views
14

Tengo una aplicación de WPF que está chocando vez que lo consigo en máquinas que no tienen un entorno de desarrollo installed-- si se trata de una víctima, soy bienvenido a cerrar, pero mi búsqueda-Fu es no poder encontrar un equivalente pregunta. Parece que obtengo una XamlParseException, pero nada más útil que eso. Necesito obtener información útil.¿Cómo puedo obtener información de error WPF .NET útil de la máquina de un usuario?

El paso por el Windows 7 registros de eventos me da este registro de errores:

Fault bucket , type 0 
Event Name: CLR20r3 
Response: Not available 
Cab Id: 0 

Problem signature: 
P1: MyApp.exe 
P2: 1.0.0.0 
P3: 4b88323d 
P4: PresentationFramework 
P5: 3.0.0.0 
P6: 4a174fbc 
P7: 624f 
P8: e1 
P9: System.Windows.Markup.XamlParse 
P10: 

Attached files: 
C:\Users\Mark\AppData\Local\Temp\WER7DC.tmp.WERInternalMetadata.xml 

These files may be available here: 
C:\Users\Mark\AppData\Local\Microsoft\Windows\WER\ReportArchive 
\AppCrash_generatortestbed_4fa7dff09a9e893eb675f488392571ced4ac8_04ef1100 

Analysis symbol: 
Rechecking for solution: 0 
Report Id: cd55060c-271f-11df-b6ff-001e52eefb8e 
Report Status: 1 

He comprobado esos directorios, y el primero no existe, mientras que el segundo contiene un archivo que acaba de wer enumera el dlls cargados.

pude instalar un entorno de desarrollo en mi máquina de prueba, pero entonces deja de ser una máquina de prueba y estoy de vuelta al punto de partida. No entiendo este error con un entorno dev instalado, por lo que no sé cómo obtener un mensaje de error detallado y útil.

EDIT: edificio fuera de comentario @Alastair Pitts abajo, así es como me han cumplimentado el manejo de excepciones:

private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { 
     Exception theException = e.Exception; 
     string theErrorPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\GeneratorTestbedError.txt"; 
     using (System.IO.TextWriter theTextWriter = new System.IO.StreamWriter(theErrorPath, true)){ 
      DateTime theNow = DateTime.Now; 
      theTextWriter.WriteLine("The error time: " + theNow.ToShortDateString() + " " + theNow.ToShortTimeString()); 
      while (theException != null) { 
       theTextWriter.WriteLine("Exception: " + theException.ToString()); 
       theException = theException.InnerException; 
      } 
     } 
     MessageBox.Show("The program crashed. A stack trace can be found at:\n" + theErrorPath); 
     e.Handled = true; 
     Application.Current.Shutdown(); 
    } 

Con suerte, voy a conseguir lo que necesito esta manera. ¡Gracias por la ayuda!

Respuesta

14

El procedimiento es que yo usaría para manejar la UnhandledExceptionevent en el dominio de aplicación.

Una vez hecho eso, usted tiene varias opciones. Registrando la excepción en un archivo, serializándolo para una inspección posterior, mostrando un cuadro de diálogo con el mensaje de excepción.

EDIT: XamlParseException 's se producen cuando se crea la ventana principal. Esto significa que se está llamando al constructor de esa ventana. Si realiza alguna lógica en ese constructor, cualquier excepción resultante arrojará un XamlParseException. Entiendo que el controlador UnhandledException seguirá detectando esta excepción.

Para conectar el evento UnhandledException en WPF, agregue la conexión de evento en su App.xaml

<Application 
    x:Class="DispatcherUnhandledExceptionSample.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    StartupUri="MainWindow.xaml"  
    DispatcherUnhandledException="App_DispatcherUnhandledException" /> 

que luego se agrega un método en sus app.cs

public partial class App : Application 
{ 
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     // Process unhandled exception do stuff below 

     // Prevent default unhandled exception processing 
     e.Handled = true; 
    } 
} 

MSDN

+0

Si itis un XamlParseError, parece que ese error ocurriría antes de que pudiera utilizar cualquier código, por si el dibujo de la ventana de la aplicación. ¿Hay alguna manera de rastrear esta excepción antes de que se llame al código de usuario? ¿O estoy equivocado sobre XamlParseErrors? – mmr

1

El registro de excepciones (como en la respuesta de Alastair Pitts) sería una ayuda para poner a cero el origen del error.

La presencia de XamlParse en P9 línea sugiere que puede ser un problema la inicialización de un control o ventana de la descripción XAML. Puede haber un ensamblado al que haga referencia el XAML que no se encontró en la computadora de destino o que no coincidió con la firma en el XAML.

Editar:

XAML análisis sintáctico se produce en InitializeComponent() que se llama en el constructor de la ventana o de control

2

Además de tener un controlador de eventos excepción no controlada que registra el seguimiento de la pila, es también útil para ver los volcados de error que se generan en la máquina de reproducción.Usted ha mencionado que es Windows 7, por lo que puede buscar correspondientes archivos de volcado de las siguientes maneras:

  1. Panel de control -> Todos los elementos del panel de control -> Centro de Acción -> "Ver problemas reportar" enlace debajo del Mantenimiento/Área "Comprobar soluciones a problemas no informados". Esto muestra una lista de las aplicaciones que se han bloqueado y puede profundizar en ellas para encontrar los archivos de volcado y la información. Busque el enlace "Ver una copia temporal de estos archivos" en la parte inferior izquierda de los detalles técnicos del problema. Esto extraerá los archivos de volcado y se los mostrará en una ventana del explorador.

  2. cd/d% ProgramData% \ Microsoft \ Windows \ WER.

WER parece mantener su volcados por debajo de ese directorio, así que lo que hago es a dir/s/b para una parte del nombre de la aplicación que sé que van a estar allí. Por ejemplo, hice una aplicación crashy a propósito que llamé crashyapp.exe:

 
C:\ProgramData\Microsoft\Windows\WER>dir /s/b *crashy* 
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_crashyapp.exe_56f8d710d72e31d822d6b895c5c43a18d34acfa1_cab_2823e614 
Ese directorio contiene los archivos hdmp y mdmp para el bloqueo. ¡Es hora de instalar un depurador!

+0

Interesante idea. Desde entonces, me mudé de la empresa donde esto era un problema, pero puedo transmitirlo a algunos amigos míos que todavía están luchando con el problema. Parece que los errores de WPF casi siempre son XamlParseExceptions, por lo que cualquier información que no sea útil es útil. – mmr

0

Además de la respuesta de Alistair, que es el InnerException que me dio las pistas que estaba buscando:

public partial class App : Application { 
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { 
     Exception ex = e.Exception; 
     Exception ex_inner = ex.InnerException; 
     string msg = ex.Message + "\n\n" + ex.StackTrace + "\n\n" + 
      "Inner Exception:\n" + ex_inner.Message + "\n\n" + ex_inner.StackTrace + "\n\n" + 
      Utils.RegistryVersion(); 
     MessageBox.Show(msg, "Drop Print Batch Application Halted!", MessageBoxButton.OK); 
     Utils.MailReport(msg); 
     e.Handled = true; 
     Application.Current.Shutdown(); 
    } 
} 
Cuestiones relacionadas