2010-07-27 14 views
5

Estoy usando Visual Studio 2010 y estoy codificando en C#. Tengo un DLL de terceros que estoy usando en mi proyecto. Cuando intento utilizar un método específico, en ocasiones aparentemente aleatorias, el programa simplemente se bloquea, sin excepción. La sesión simplemente termina. ¿Hay alguna forma de que pueda rastrear lo que está pasando?Programa de bloqueo de dll de terceros sin excepción lanzada

+0

La razón más típica detrás de un programa que acaba de salir, sin mensaje de error o nada, es un desbordamiento de la pila. En este caso, el programa no tiene suficiente pila para presentar el mensaje de error, y Windows simplemente lo termina. ¿Podría ser esto? –

+0

Configuré VS para que arrojara excepciones de StackOverflow y AccessViolation según el comentario de dark_charlie.pero no ocurre nada – sbenderli

Respuesta

19

La forma en que se distribuye la pila de un hilo en Windows es la siguiente (más o menos, esta no es una descripción exacta de todo lo que sucede, lo suficiente para darle la esencia). es algo diferente de cómo el código no administrado lo maneja también.)

En la parte superior de la pila están todas las páginas comprometidas que está utilizando. Luego hay una "página de guardia": si tocas esa página, la página de guardia se convierte en una nueva página de pila, y la página siguiente se convierte en la nueva página de guardia. Sin embargo, la página última de la pila es especial. Si lo golpeas una vez, obtienes una excepción de desbordamiento de pila. Si lo golpea dos veces, entonces el proceso finaliza inmediatamente. Con "inmediatamente" quiero decir "inmediatamente", sin excepción, vaya directo a la cárcel, no apruebe, no cobre $ 200. El sistema operativo razona que en este punto el proceso está profundamente enfermo y posiblemente se ha convertido activamente en hostil para el usuario. La pila se ha desbordado y el código que está desbordando la pila podría estar intentando escribir arbitrariamente mucha basura en la memoria. (*)

Dado que el proceso es potencialmente un peligro para sí mismo y para los demás, el sistema operativo lo quita sin permitir que se ejecute más código.

Mi sospecha es que algo en su código no administrado está llegando a la página de la pila final dos veces. Casi cada vez que veo que un proceso desaparece repentinamente sin excepción u otra explicación es porque se golpeó la página de pila de "no me metas".

(*) A principios de la década de 1990 trabajé en controladores de base de datos para un pequeño sistema operativo llamado NetWare. No tenía este tipo de protecciones que los sistemas operativos más modernos ahora tienen rutinariamente. Necesitaba ser capaz de "cambiar pilas" dinámicamente mientras se ejecuta en el nivel de protección del kernel; Sabía cuando mi controlador había volado accidentalmente la pila porque eventualmente escribiría en la memoria de la pantalla y luego pude depurar el problema mirando qué basura se había escrito directamente en la pantalla. Ah, esos fueron los días.

3

Intenta obligar al depurador a detectar incluso las excepciones manejadas, especialmente las malas como Violación de acceso y Desbordamiento de pila. Puedes hacer esto en Debug -> Exceptions. Es posible que la DLL de terceros capture todas las excepciones y luego invoque exit() o alguna belleza similar que detenga todo el programa.

+0

Lo configuro para que se generen las excepciones StackOverflow y AccessViolation, pero de nuevo, no se lanza nada. – sbenderli

+0

¿Tiene símbolos de depuración disponibles para ese dll? ¿En qué idioma está escrita esa DLL? ¿Es una DLL administrada o no administrada? También puede simplemente intentar verificar todo en la ventana de excepciones y esperar :) –

+0

Es un dll de interoperabilidad. Dice que el ensamblado de interoperabilidad primaria también está instalado en el caché de ensamblaje global (GAC) si tiene instalado .NET Framework. ¿Esto significaría que está gestionado? – sbenderli

2

¿Has comprobado Registro de eventos de Windows? Puede acceder a eso en el menú Herramientas administrativas> Visor de eventos. Compruebe en particular los registros de la aplicación y del sistema.

+0

Nada en los registros :( – sbenderli

0

Si maneja su dll de terceros, usando Runtime Flow (desarrollado por mí) puede ver lo que sucede dentro de él antes del accidente: un desbordamiento de pila, una salida forzada o una excepción serán claramente identificables.

Cuestiones relacionadas