2009-01-16 22 views
14

A menudo, accidentalmente paso al código que no me interesa mientras se depura Delphi.En Delphi: cómo omitir secciones de código durante la depuración?

Comencemos diciendo que sé que puede pasar por encima de F8, y que puede ejecutar cierta línea con f4.

Ejemplo:

function TMyClass.DoStuff():Integer; 
begin 
    // do some stuff 
    bla(); 
end; 

procedure TMyClass.Foo() 
begin 
    if DoStuff()=0 then // press F7 when entering this line 
    beep; 
end; 

Ejemplo: Quiero entrar en método DoStuff() pulsando F7, pero en vez de ir allí, primero terminar en FastMM4.FastGetMem(), que es una mancha enorme del código de ensamblaje que obviamente no estoy interesado en este momento.

Hay varias maneras de hacer esto, y no me gusta ninguno de ellos:

  • Añadir un punto de interrupción en " bla" (casi inútil si sólo desea entrar en DoStuff en ocasiones especiales, como la iteración 23498938);

  • En lugar de pulsar F7, mover manualmente el cursor a " bla", y pulse F4 (Obras de este ejemplo sencillo En la práctica, no.);

  • En caso de FastMM: desactivar temporalmente fastmm;

¿Hay alguna manera de insinuar el IDE que estoy Nunca interesados ​​en entrar en un determinado bloque de código, o qué siempre tienen que establecer puntos de interrupción adicionales o utilizar F4 para tratar de evitar esto?

Espero alguna directiva mágica de compilación como {$ NODEBUG BEGIN/END} o algo así.

En la mayoría de los casos, poder excluir unidades enteras sería lo suficientemente fino para mí, pero ser capaz de evitar ciertos métodos o incluso líneas de código sería aún mejor.

Actualización: Tal vez codegear debería introducir algo así como skip- puntos (a diferencia de puntos de ruptura) :-)

Respuesta

22

Hay un "interruptor de nodo mágico". {$ D-} deshabilitará la generación de código de depuración. Coloque eso en la parte superior de su unidad FastMM y no terminará rastreando en él. Y si terminas en una función en la que no quieres estar, SHIFT-F8 te sacará rápidamente. (ADVERTENCIA: No utilice SHIFT-F8 desde el interior de una rutina de montaje código que juega con la pila comportamiento impredecible puede resultar F4 al fondo del mismo lugar...)

+0

¡Excelente! Funciona exactamente de la manera que yo quiero: el depurador ya no interviene más en él, al tiempo que obtiene la finalización del código y puede ver y modificar el código "depurar-deshabilitar" si quiero. –

+0

En cuanto a FastMM4: el informe de fugas aún funciona, siempre que no tenga {$ define RequireDebugInfoForLeakReporting}, que no está definido de manera predeterminada. –

+0

Usted señor, en lo que a mí respecta, he ganado Internet hoy. Funcionó maravillosamente. Muchas muchas gracias. – Alan

2

yo sepa, el depurador sólo es consciente de los archivos de Navegación Camino que se pueden modificar en Opciones. Por lo tanto, si excluye las rutas de los módulos que no le interesa depurar, tendrá el efecto de lo que desea hacer.

Una advertencia: la finalización del código también se basa en la ruta de exploración, por lo que puede encontrarse con ocasiones en las que la finalización del código se queda corta cuando es necesario.

0

No. No creo que haya una manera de decirle al depurador que nunca se detenga en una determinada sección de código. No hay una directriz mágica.

Lo mejor que puede hacer cuando entra en una rutina en la que no desea estar es utilizar Shift + F8 que se ejecutará hasta la devolución. Luego haz un F7 o F8 para salir del procedimiento.


Hmmm. Ahora veo la respuesta de Mason. Aprendí algo. Gracias, Mason.1

4

Use un no depuración DCU precompilado de FasmMM

2

Aunque no es una respuesta directa a su pregunta, podría modificar su primera propuesta de solución, poniendo punto de ruptura en bla que sólo se activa cuando un punto de interrupción en Foo se pasa (o alguna otra condición de su elección, como recuento de iteraciones). Entonces solo se romperá cuando lo desees.

Como un lado, estoy encontrando cada vez más que no estoy deteniendo la ejecución en puntos de ruptura, sino más bien volcando valores variables o volcados de pila en el registro de mensajes. Esto permite un análisis más cuidadoso que la inspección sobre la marcha de variables, etc. FWIW.

7

Si va a saltar en Código FastMM, luego hay operaciones de memoria ocurriendo. El código que has mostrado no tiene ninguna operación de memoria, por lo que tu pregunta está incompleta. Trataré de adivinar lo que querías decir.

Cuando una subrutina tiene variables locales de tipos administrados por el compilador (como cadenas, interfaces o matrices dinámicas), el prólogo de funciones tiene un trabajo no trivial que hacer. El prólogo también es donde se ajustan los recuentos de referencia de los parámetros de entrada. El depurador representa el prólogo en la línea begin de la función. Si el punto de ejecución actual es esa línea y usted "entra en ella", se le dirigirá al código RTL para administrar los tipos especiales. (No esperaría que FastMM se involucre allí, tampoco, pero tal vez las cosas hayan cambiado de lo que estoy acostumbrado). Una cosa fácil de hacer en esa situación es "pasar" por la línea begin en lugar de hacerlo en ella; usa F8.

Si realmente está presionando F7 cuando ingresando su línea resaltada, entonces lo está haciendo mal. Eso es entrar en la línea begin, no la línea donde se llama DoStuff. Entonces, si te llevan al código de FastMM no tiene nada que ver con la implementación de DoStuff. Para depurar la llamada a DoStuff, el punto de ejecución actual ya debe ser la línea con la llamada en él.

Si solo desea depurar DoStuff en la iteración 23498938, puede establecer un punto de interrupción condicional en esa función. Haga clic en la canaleta para hacer un punto de interrupción normal y luego haga clic con el botón derecho para mostrar sus propiedades. Allí puede definir una condición que se evaluará cada vez que la ejecución llegue a ese punto. El depurador solo se detendrá allí cuando la condición sea verdadera. Presione F8 para "sobrepasar" la llamada DoStuff, y si la condición es verdadera, el depurador se detendrá allí como si hubiera presionado F7 en su lugar.

Puede alternar la opción "use debug DCUs" para evitar entrar en la mayoría de las unidades RTL y VCL. No sé si FastMM está incluido en ese conjunto. La diferencia clave es si las DCU a las que se ha vinculado se compilaron con información de depuración. La configuración altera la ruta de la biblioteca para incluir o excluir el subdirectorio donde se encuentran las DCU de depuración. I think puede configurar el conjunto de directorios de depuración incluidos o excluidos para que se agregue o elimine un conjunto personalizado de directorios en función de la configuración "debug DCUs".

Volver a puntos de interrupción. Puede configurar grupos de puntos de corte asignando nombres a sus puntos de interrupción. Puede usar un punto de interrupción avanzado para habilitar o deshabilitar un grupo nombrado de puntos de interrupción cuando lo pase. (Los grupos de punto de interrupción solo pueden tener un punto de interrupción, si lo desea). Por ejemplo, si solo desea interrumpir en la ubicación X si también pasó por otra ubicación Y en su programa, podría establecer un punto de interrupción deshabilitado en X y un punto de interrupción sin interrupción en Y. Establezca la configuración "habilitar grupos" en Y para habilitar el grupo X.

También puede aprovechar los puntos de interrupción deshabilitados sin habilitar ni deshabilitar automáticamente. Sus puntos de interrupción aparecen en la ventana del depurador "puntos de interrupción". Si está pasando por DoStuff y decide que desea inspeccionar bla esta vez, vaya a la ventana de punto de interrupción y habilite el punto de interrupción en bla. No es necesario navegar a la implementación de bla para establecer el punto de interrupción allí.

Para obtener más información acerca de los puntos de interrupción avanzados, consulte Using Non-Breaking Breakpoints in Delphi y el artículo de Cary Jensen de hace algunos años.

+0

>> ... por lo que se agrega o elimina un conjunto de directorios de clientes en función de la configuración "DCU de depuración". << D'oh. Eso nunca se me ocurrió. Acabo de agregar las fuentes DevEx a la ruta Debug DCU - et voilà: no más edición manual de la ruta de búsqueda del proyecto. –

+0

Tiene razón, el ejemplo es débil porque el problema específico de FastMM no ocurriría allí. Estaba en duda si aceptar esta respuesta o la de Mason. Esta respuesta está llena de información y consejos interesantes, pero la respuesta de Mason soluciona el problema de inmediato. –

5

Puede haber perdido algo con su publicación, pero con FastMM4 puede editar el archivo de inclusión FastMM4Options.Inc y eliminar el '.' a partir de la siguiente definen:


De FastMM4Options.inc ****

{Activar esta opción para suprimir la generación de información de depuración para la unidad FastMM4.pas. Esto evitará que el depurador integrado de entrar en el código de gestor de memoria.}

{$ .define NoDebugInfo}


Al volver a compilar (puede ser que necesite edificio) el depurador (debería) ya no depurar el Código FastMM

+0

(+1) A pesar de que fastmm se usó solo como ejemplo, creo que su sugerencia es la mejor manera de encargarse de fastmm4. De alguna manera se sintió mal modificar fastmm4.pas; –

3

En el archivo DPR proyecto, utilizo

uses 
{$IFNDEF DEBUG} FastMM4, {$ENDIF} 
    ... // other units 

excluir FastMM4 durante el modo de depuración. No requiere cambios en FastMM4 así que no tengo que recordar agregar {$ D-} en FastMM cuando cambio a una versión diferente.

Cuestiones relacionadas