es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Volcado de memoria de fallo de WPF con pila de llamadas de excepciones originales y memoria.

Tengo una aplicación WPF grande que también utiliza bibliotecas de C++ para algunas funcionalidades.

De vez en cuando, la aplicación se bloquea debido a una excepción no controlada o violación de acceso en el código de C++. EDIT: A veces también se bloquea en el hilo principal debido a una excepción no controlada de C#.

Ya utilizo los siguientes controladores para registrar información sobre el bloqueo:

  • DispatcherUnhandledException
  • TaskScheduler.UnobservedTaskException
  • AppDomain.CurrentDomain.UnhandledException

(EDIT: Me registro en estos eventos de manera muy similar a este ejemplo: https://stackoverflow.com/a/46804709/2523211)

Sin embargo, si activo la creación de archivos de volcado y se alcanzan estas funciones (es decir, en un escenario de excepción no controlada), entonces la pila de la excepción original ya se ha desenrollado y no hay forma de inspeccionar la pila de llamadas junto con la memoria y los hilos en el momento del error en sí.

Obviamente puedo ver la traza de la pila en sí misma en la excepción que obtengo como argumento en esos controladores, pero eso es todo y deseo ver el estado de mi código cuando se lanzó la excepción.

(EDIT: La pila de llamadas solo muestra que estoy en un marco del despachador y no puedo inspeccionar las variables y otros estados de memoria de la aplicación en el momento de la excepción. Puedo utilizar los datos de la excepción en sí y ver la pila de llamadas desde ella, pero eso no es suficiente para reproducir o comprender realmente por qué ocurrió la excepción)

Si no me suscribo a esos eventos, nada cambia, todavía no puedo ver la pila de llamadas original en el archivo de volcado. (EDIT: porque solo obtengo una pila de llamadas en el despachador)

También he intentado establecer e.Handled = false, pero creo que ese es el valor predeterminado de todos modos.

¿Hay alguna manera de indicarle al despachador de WPF o tal vez el problema está en otro lugar, para que, si ocurre una excepción, se propague hasta el final y así, cuando se cree un volcado para ella, pueda tener un archivo de volcado útil?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en C#, WPF, dump, dispatcher y unhandled-exception, sugiero una posible solución para el problema donde una aplicación WPF se bloquea debido a una excepción no controlada o una violación de acceso en el código C++.

    La configuración actual incluye manejadores como DispatcherUnhandledException, TaskScheduler.UnobservedTaskException y AppDomain.CurrentDomain.UnhandledException, pero no proporcionan suficiente información sobre el estado de la aplicación en el momento del error en sí.

    Para abordar este problema, puede ser posible indicar al dispatcher de WPF u otras áreas relevantes que permitan que la excepción se propague hasta arriba, lo que habilitaría un archivo de volcado útil. Una solución potencial podría ser intentar capturar las excepciones en el nivel de la biblioteca de C++ y luego lanzarlas nuevamente como excepciones de C#. Este enfoque puede permitir que se desencadene DispatcherUnhandledException con la excepción original, por lo tanto, proporcionando información útil en el archivo de volcado.

    Otra posible solución podría ser utilizar una herramienta de terceros, como ProcDump, que permite capturar un volcado de una aplicación cuando se bloquea debido a una excepción. La herramienta se puede configurar para capturar un archivo de volcado cuando la aplicación se bloquea, proporcionando información más detallada sobre el estado de la aplicación en el momento del error.

    En resumen, puede haber varias formas de abordar este problema, pero capturar las excepciones en el nivel de la biblioteca de C++ o utilizar una herramienta de terceros pueden proporcionar un archivo de volcado útil para fines de depuración.

Comments are closed.