2011-05-16 9 views
5

Llamo a la función en .NET usando Reflection (Method.Invoke). Si se produce un error dentro de este método y se produce una excepción, el depurador no muestra el código real sino que se detiene en la llamada a Invoke(). Puedo recuperar información de excepción de InnerException, pero esto es muy inconveniente, en comparación con la depuración regular con callstack disponible, y así sucesivamente. ¿Pueden los métodos invocados utilizando Method.Invoke depurarse como las llamadas a funciones regulares?Función de depuración invocada en .NET

Respuesta

0

Mi solución es crear temporizador y método de llamada dentro Tick():

código de interfaz gráfica de usuario -> función de llamada a través de Method.Invoke -> Ajustes de función de una temporizador -> en Tick hay cuerpo de la función

por desgracia, no es muy bonita (y no es adecuado en algunos casos)

6

Lo que te gusta es la función "Just My Code". El depurador limita de forma predeterminada la depuración a un código que se considera creado por el desarrollador. Esto reduce mucho ruido que estaría presente en, digamos, depurar un lanzamiento de WPF o WinForms.

Para que elementos como el asistente de excepciones se ejecuten para todos los códigos, debe desactivar Just My Code.

  • Herramientas -> Opciones
  • depurador
  • Desactive la opción "Habilitar Sólo mi código de depuración"
+1

por desgracia, "Habilitar Sólo mi código" ya estaba sin marcar. Pero parece irrelevante, ya que tanto la persona que llama como la llamada son en realidad mi código. – John

+1

@John, eso es extraño. Mi siguiente paso sería activar "break-in-throw" para todos los tipos de excepción y ver si eso me dejó donde esperaba. Eso no resolverá su problema, pero nos llevará un paso más allá. – JaredPar

+0

Eso es muy extraño, después de activar el "lanzamiento interrumpido", recibo la excepción FileNotFound para el ensamblado XmlSerializer que no se pudo cargar. Sin "break on throw", todo funciona bien. – John

2

Si todo lo demás falla, también se puede poner algo como esto en el método que se invoca:

#if DEBUG 
    System.Diagnostics.Debugger.Break(); 
#endif 

que, básicamente, "programáticamente" causar un punto de interrupción allí.

También podría hacerlo un poco mejor haciendo:

if(Debugger.IsAttached) 
    Debugger.Break(); 

de modo que sólo se romperá si en realidad se está ejecutando en el depurador.


Editar:

En segundo pensamiento, si usted tiene el código para editarlo, entonces es probable que pueda atenerse sólo un punto de interrupción regular de allí a través de VisualStudio. Creo que mi respuesta no tiene sentido ... lo siento :)

+1

Tu respuesta tiene mucho sentido, mira mi comentario a la respuesta de @JaredPar también. Estaba enfrentando problemas con los puntos de interrupción omitidos y tu método funcionó. – ajeh

Cuestiones relacionadas