2009-09-02 10 views
25

Estoy intentando rastrear un error que ocurre cuando hago clic en un elemento en particular en una página aspx ...¿Hay alguna forma de romper con la siguiente línea de código ejecutada en Visual Studio?

En el pasado he tenido que rastrear la clase que maneja ese evento en particular y poner un punto de quiebre en la línea que creo que debería ser golpeado. A menudo me toma varios intentos antes de finalmente encontrar la clase correcta ... especialmente si la clase es un control de usuario enterrado en algún lugar ...

Me ha dejado preguntándome si hay alguna manera de hacer que Visual Studio se rompa en la siguiente línea de código ejecutada después de hacer clic en un elemento (por ejemplo, un botón) en una página aspx. Sé que hay una manera de romper cualquier excepción que se arroje así que estoy pensando que tal vez haya algo similar que pueda ayudarme.

Si este tipo de característica no es una posibilidad, tal vez alguien podría sugerir una mejor manera para mí para encontrar rápidamente la clase quiero depurar ...

+0

¿Cómo se manifiesta este "error"? ¿No puedes establecer un punto de quiebre allí? ¿O conoce algún otro código que se ejecutará después de que haya hecho clic en ese botón para establecer un punto de interrupción allí? Si es así, eche un vistazo a la ventana de la pila. Debería mostrarle el controlador de eventos llamado. Entonces puedes poner un punto de quiebre allí. – sbi

+0

@sbi el error se manifiesta cuando hago clic en un botón que se expande para mostrar más información y termina mostrando más datos de los necesarios. Estaba tratando de encontrar qué método agregar algunos filtros a los datos que se muestran. Eventualmente pude detectar el método mal nombrado. Era un método delegado para cuando se accedía a un elemento de la cuadrícula de datos. Todavía me gustaría que fuera más fácil de encontrar ... – mezoid

+0

@Kyralessa Qué comentario tan increíblemente inútil es. Tal vez podrías encontrar una manera mejor de hacer que reconsiderara tu respuesta que insultarme ... – mezoid

Respuesta

27

¿Has probado el botón Debug> Break All ("pausa")? (Ctrl +rotura)

Debug > Break All

Por lo general, va a romper en algún lugar bastante bajo en la pila, como en la demostración de() para el formulario principal en una aplicación Windows Forms, pero si luego paso en para superar eso, a menudo funcionará bastante bien para este tipo de cosas.

+1

No estoy seguro de que el botón Romper todo sea exactamente lo que estoy buscando, ya que creo que el código se ejecutará en milisegundos de mi clic en la pantalla y, como tal, no podría detenerlo lo suficientemente rápido. – mezoid

+2

Repito: ¿Has * probado *? No intente hacer clic en Romper todo después de hacer clic en el botón. Hace clic en Romper todo * antes * hace clic en el botón, luego hace clic en Entrar, y * luego * hace clic en el botón. –

+0

Ok, lo he intentado de nuevo ... y no funcionó. Quizás es porque estoy depurando una página aspx. Cuando presiono pausa y luego hago clic en algo en la ventana, todo lo que hace es intentar cargar la página ... pero no pasa nada ... Tengo que presionar ejecutar y luego pausar nuevamente antes de que se rompa y para entonces es demasiado tarde . Tendré que probar tu sugerencia, algo así como una aplicación WinForms o Console y ver cómo funciona eso ... si eso funciona, marcaré el tuyo como la respuesta ... pero por lo que busco no funciona. Parece que funciona ... – mezoid

4

¿Está buscando el Step Into (F11) o Step Over (F10)?

- Edit

¿Usted también sabe acerca de la ventana Call Stack? Puede ayudarte a determinar tu ubicación y lo que está sucediendo.

+0

lo siento, estoy al tanto de F11, F10 y la ventana de la pila de llamadas. Estoy buscando algo que me permita romper una vez que toco el código base después de activar una acción en una página aspx. – mezoid

+0

mezoid: quizás desee escribir 'System.Diagnostics.Debugger.Break();' en una parte específica de su código? Eso forzará al depurador a romper allí, independientemente de que establezca explícitamente un punto de quiebre. –

+0

excepto que no sé dónde está la clase en la que necesito poner el descanso ... :( – mezoid

0

Depuración -> Excepciones

Comprobar lanzado para las excepciones CLR.

EDITAR

Las probabilidades son que está teniendo una excepción CLR. Con este método, el depurador siempre se romperá cuando ocurra una excepción. Esto es muy conveniente en comparación con la lectura del seguimiento de la pila.

+0

eso es bueno, pero en mi caso el error que estoy buscando no es causado por una excepción – mezoid

2

Conditional Breakpoints puede ser tu respuesta. Puede configurarlos si cree que su código se está rompiendo y solo se detendrán cuando se cumpla la condición.

+0

cierto, pero quiero encontrar una manera de no tener que establecer un montón de puntos de ruptura para encontrar el código que estoy buscando – mezoid

0

Algunas ideas:

  • Si utiliza una convención de nomenclatura coherente para sus controladores de eventos, entonces debería ser trivial para hacer una búsqueda global para todos ellos y añadir puntos de interrupción. Puede grabar rápidamente una macro en el primer golpe y luego reproducir la macro para eliminar todo el dolor de repetir la operación muchas veces. Con un poco de práctica podrás romper todos los controladores en unos segundos planos.

  • Agregue un controlador de eventos adicional para el evento (créelo temprano, por ejemplo, en el constructor, por lo que se agrega antes de todos los demás controladores de eventos que su aplicación agrega y se espera que primero se llame) y adhiera un punto de interrupción. Una vez que llegue al punto de interrupción, puede dar un paso a través de los otros manejadores de eventos en el evento.

  • escribe un controlador de eventos personalizado que maneja el clic y simplemente genera un nuevo evento. Adjunte todos sus otros controladores de eventos a este evento secundario. Luego puede romper el primer controlador y pasar por los controladores secundarios que llama.

Cuestiones relacionadas