¿Cómo debe diagnosticar el error SEHException? El componente externo ha generado una excepción

86

Siempre que un usuario informe un error como

System.Runtime.InteropServices.SEHException - ¿El componente externo ha generado una excepción?

¿Hay algo que yo, como programador, pueda hacer para determinar la causa?

Escenario: un usuario (que utiliza un programa escrito por mi empresa) ha informado de este error. Esto puede o no haber sido un error único. Mencionaron que en el último mes, la computadora ha 'dejado de funcionar' dos veces. He aprendido por experiencia, no tomar esta descripción demasiado literalmente, ya que generalmente significa que alguien relacionado con la computadora no está funcionando como se esperaba. No pudieron darme más detalles y no pude encontrar ningún error registrado. Por lo tanto, puede que haya sido este error o no.

Desde el seguimiento de la pila, el error real fue al construir una clase que no llama directamente a ningún código de interoperabilidad, pero quizás complicado por el hecho de que el objeto puede ser parte de una lista que está vinculada a datos en una cuadrícula DevExpress.

El error fue "detectado" por una rutina de excepción no controlada que normalmente cerrará el programa, pero tiene una opción para ignorar y continuar. Si optaron por ignorar el error, el programa continuó funcionando, pero el error volvió a ocurrir la próxima vez que se ejecutara esta rutina. Sin embargo, no volvió a ocurrir después de cerrar y reiniciar nuestra aplicación.

La computadora en cuestión no parecía estar estresada. Está ejecutando Vista Business, tiene 2 GB de memoria y, según el Administrador de tareas, solo estaba usando aproximadamente la mitad de eso con nuestra aplicación, aproximadamente 200 Mb.

Hay otra información que puede ser relevante o no. Otra sección del mismo programa utiliza un componente de terceros que es efectivamente un envoltorio dotnet alrededor de una dll nativa y este componente tiene un problema conocido en el que muy ocasionalmente, obtienes un

Intento de leer o escribir en la memoria protegida. Esto suele ser una indicación de que otra memoria está dañada

Los fabricantes de componentes dicen que esto se ha solucionado en la última versión de su componente que estamos usando internamente, pero aún no se ha entregado al cliente.

Dado que las consecuencias del error son bajas (no se pierde ningún trabajo y reiniciar el programa y volver a donde estaban solo toma un minuto como máximo) y dado que el cliente en breve estará obteniendo una nueva versión (con la tercera versión actualizada). party), obviamente puedo cruzar los dedos y esperar que el error no vuelva a ocurrir.

¿Pero hay algo más que pueda hacer?

sgmoore
fuente

Respuestas:

28

Si. Este error es una excepción estructurada que no se asignó a un error de .NET. Probablemente sea su asignación de DataGrid la que arroja una excepción nativa que no se detectó.

Puede saber qué excepción se está produciendo mirando la propiedad ExternalException.ErrorCode . Verificaría el seguimiento de la pila y, si está vinculado a la cuadrícula de DevExpress, les informaré del problema.

Reed Copsey
fuente
1
StackTrace no mencionó a DevExpress en ninguna parte, sino solo a mi clase. Tendrá que verificar para ver cuál era el Código de error.
sgmoore
En ese caso, intente averiguar qué arrojó exactamente el mensaje de error.
Reed Copsey
4
"mirando la propiedad ExternalException.ErrorCode", ¿tiene alguna pista sobre cómo hacerlo exactamente? VS me muestra "Se produjo una excepción no controlada del tipo 'System.Runtime.InteropServices.SEHException' en .... dll Información adicional: Eine externe Komponente hat eine Ausnahme ausgelöst.", Pero aparte de las aplicaciones C #, por ejemplo, no hay ningún vínculo para ver "Detalles" del objeto de excepción en cualquier lugar.
OR Mapper
El depurador de VSCode muestra una instancia de excepción $ en Locales; esto incluye un campo Mensaje, que incluye el código y un mensaje de error legible por humanos.
nightblade9 hace
8

Tuve un problema similar con una SEHException que se lanzó cuando mi programa usó por primera vez un contenedor dll nativo. Resultó que faltaba la DLL nativa para ese contenedor. La excepción no fue de ninguna manera útil para resolver esto. Lo que sí ayudó al final fue ejecutar procmon en segundo plano y verificar si había algún error al cargar todas las DLL necesarias.

Maurice Gilden
fuente
3

Los fabricantes de componentes dicen que esto se ha solucionado en la última versión de su componente que estamos usando internamente, pero esto ya se ha entregado al cliente.

Pregúntele al fabricante de componentes cómo probar si el problema que está teniendo el cliente es el problema que dice haber solucionado en su última versión, sin / antes de implementar su última versión para el cliente.

ChrisW
fuente
1

Me he encontrado con este error cuando la aplicación reside en un recurso compartido de red y el dispositivo (computadora portátil, tableta, ...) se desconecta de la red mientras la aplicación está en uso. En mi caso, se debió a que una tableta Surface se salió del alcance inalámbrico. No hay problemas después de instalar un WAP mejor.

Conrad
fuente
1
Lo estaba obteniendo al azar mientras accedía a diferentes tipos de reflexión (GetAssemblyName, GetProperty, Activator, etc.) tanto en mi código como en bibliotecas de terceros, y solo en un entorno de cliente, de manera similar con bibliotecas en una ubicación remota. Hay muchas pruebas de que es un error del framework .net.
Andriy K
Andriy K: No creo que esto sea un problema de .NET, creo que los identificadores de los archivos abiertos en el recurso compartido de red se pierden / caen de alguna manera, tal vez un error en Windows o un problema de red. Los ensamblados se asignan en memoria y se paginarán desde el disco a pedido (bomba de tiempo), posiblemente la memoria también se pueda descartar en situaciones de poca memoria. Si los identificadores de archivos abiertos no son estables, probablemente se convertirá en humo. .NET podría haberlo manejado y vuelto a abrir el archivo (soluciona el problema), pero puede ser complicado.
osexpert
Tengo el mismo problema. Obtengo System.Runtime.InteropServices.SEHException (0x80004005) sin rastro de pila. Esta es la InnerException de una TargetInvocationException. TargetInvocationException tiene seguimiento de pila, pero no tenía sentido para mí, ya que parecía provenir de main o Application.Run. Sucede de forma muy aleatoria, sobre todo en las tardes / noches. Supongo que la única "solución" es no ejecutar desde la unidad de red: - | Tal vez agregue un cheque que pueda bloquear este escenario: stackoverflow.com/questions/8633680/…
osexpert
0

Solo otra información ... Tuve ese problema hoy en un sistema TS de Windows 2012 R2 x64 donde la aplicación se inició desde una ruta unc / network. El problema ocurrió para una aplicación para todos los usuarios del servidor de terminal. La ejecución de la aplicación de forma local funcionó sin problemas. Después de un reinicio, comenzó a funcionar nuevamente: la SEHException lanzada había sido Constructor init y TargetInvocationException


fuente
0

Configuraciones de mi máquina:

Sistema operativo: Windows 10 versión 1703 (x64)

Me enfrenté a este error mientras depuraba mi proyecto C # .Net en Visual Studio 2017 Community Edition. Estaba llamando a un método nativo realizando p / invoke en un ensamblado de C ++ cargado en tiempo de ejecución. Encontré el mismo error informado por OP.

Me di cuenta de que Visual Studio se inició con una cuenta de usuario que no era un administrador en la máquina. Luego reinicié Visual Studio con una cuenta de usuario diferente que era un administrador en la máquina. Eso es todo. Mi problema se resolvió y no volví a enfrentarlo.

Una cosa a tener en cuenta es que se suponía que el método que se estaba invocando en el ensamblado de C ++ escribiría algunas cosas en el registro. No fui a depurar el código C ++ para hacer algo de RCA, pero veo la posibilidad de que todo fallara ya que se requieren privilegios administrativos para escribir el registro en el sistema operativo Windows 10. Entonces, antes, cuando Visual Studio se ejecutaba con una cuenta de usuario que no tenía privilegios administrativos en la máquina, las llamadas nativas fallaban.

RBT
fuente
0

Recibí este error mientras ejecutaba pruebas unitarias en el almacenamiento en caché de inmemory que estaba configurando. Inundó el caché. Después de invalidar el caché y reiniciar la máquina virtual, funcionó bien.

atreyHazelHispanic
fuente