2010-05-04 11 views
11

Estoy usando Delphi 2010 y me pregunto si hay una forma de rastrear a través del código que está en el proyecto sin rastrear a través de llamadas a las VCL incluidas.¿Hay alguna manera de rastrear a través del único origen del proyecto en Delphi?

Por ejemplo - usted pone en un punto de interrupción y luego utilice Shift +F7 para rastrear a través de la línea por línea. Ahora se encuentra con una llamada a un procedimiento largo en una VCL; en mi caso, a menudo es un Measurement Studio u otro componente que extrae los doodads para un montón de E/S, OPC u otros bits. En cualquier caso, lo que ocurre es que el depurador salta del archivo fuente activo, abre el origen del componente y rastrea a través de esa línea por línea. A menudo, esto es cientos o miles de líneas de código que no me importan; solo quiero que se ejecute y regrese a la siguiente línea fuente en MI proyecto.

Obviamente, puede hacer esto estableciendo puntos de interrupción en cada instancia de una llamada externa, pero a menudo hay demasiados para hacerlo práctico: pasaría una hora configurando cien puntos de interrupción cada vez que quisiera pasar por un sección de código.

¿Hay un ajuste o una herramienta en alguna parte que puede hacer esto? Permitir que uno rastree el código dentro del proyecto mientras se ejecuta de forma silenciosa el código que es externo al proyecto.

Respuesta

12

El depurador no dará un paso a través de las unidades que no tienen información de depuración, por lo que el objetivo es hacer que el compilador omite la información de depuración de las unidades que no le interesan.

Pon las unidades de la biblioteca de un proyecto de biblioteca separado. Eso le da la capacidad de tener configuraciones de compilación separadas para esas unidades sin afectar su proyecto. Compile la biblioteca sin información de depuración habilitada. Luego, elimine esas unidades de biblioteca de su proyecto. Puede seguir usándolos, pero ya no pertenecerán a su proyecto.

Un aspecto importante aquí es que las DCU deben residir en un directorio separado del código fuente. Si el compilador encuentra DCU y ve el código fuente en la misma carpeta, es probable que recompile ese código cuando realmente no lo desee. Establezca la "carpeta de salida DCU" de sus proyectos en algo distinto al predeterminado.

Para realmente haces bien, puede hacer lo que la VCL y compilar dos versiones diferentes de sus bibliotecas. Compile uno con información de depuración y uno sin, y coloque los archivos compilados en directorios diferentes. Agregue el directorio con las versiones de depuración a su configuración Delphi; ya debe haber una carpeta allí enumerada que contiene las DCU de depuración provistas por Delphi.

Al configurar dos versiones diferentes, que permita que elegir si desea entrar en el código de la biblioteca. Simplemente active o desactive la opción "use debug DCUs" en la configuración de su proyecto. Delphi automáticamente agregará y eliminará la carpeta de versión de depuración de la ruta de búsqueda cuando active esa configuración.


Tenga en cuenta que a pesar de que tendrá un proyecto de biblioteca separada para sus unidades de biblioteca, no es necesario vincular o distribuir el DLL o paquete que genera ese proyecto. Puede seguir usando los archivos DCU directamente en su proyecto EXE. Solo está configurando el proyecto por separado para que pueda seleccionar diferentes configuraciones de compilación para esas unidades. Agregue la carpeta de salida DCU del proyecto de la biblioteca a la ruta de búsqueda de su proyecto EXE, y puede continuar usando las unidades directamente sin necesidad de distribuir el archivo DLL o el paquete del proyecto de la biblioteca.

El IDE puede intentar agregar nuevos directorios a la ruta de búsqueda automáticamente. No toleres eso. Si hay un directorio de origen allí que el IDE agregó para usted y no lo quiere allí, puede quitarlo. El IDE solo está tratando de ser útil, pero no sabe acerca de su plan para tener carpetas compiladas y fuente separadas.

+0

Gracias, Rob, eso es muy útil. En la actualidad, las bibliotecas no están incluidas en el proyecto, simplemente son BPL que se han agregado directamente a Delphi a través de "Componentes-> Instalar paquetes ..." Sin embargo, revisé mi directorio bin/packages y encontré que los archivos fuente están de hecho en subcarpetas allí junto con las DCU. Intentaré con lo que sugieres y veré si no puedo hacer que se comporte con sensatez. Gracias amablemente, ¡desearía poder comprarte una cerveza! –

+1

Acabo de notar mi uso ambiguo de "incluido" en la publicación original. Supongo que debería haber dicho que estos solo se incluyeron en la medida en que se mencionaron en las secciones "Usos" de mis unidades y no que físicamente fuentes en mi proyecto De todos modos, creo que fueron las fuentes extraviadas en la carpeta bin las que Delphi estaba buscando en el inframundo para rastrearlas. Tengo que mantener este con correa corta, ¿eh? –

3

Otro método es utilizar la información de depuración y las directivas del compilador de información de símbolos locales: agregue {$D-$L-} al inicio de cada unidad.

Esto SIEMPRE suprimirá la generación de información de depuración para esa unidad. Si necesita rastrear el código, comente las directivas.

+1

No es una mala sugerencia: he hecho esto para archivos en mis propios proyectos, pero en este caso con bibliotecas de componentes puede ser una gran cantidad de archivos fuente para entrar y editar, especialmente cuando las llamadas deben ir a unidades ya compiladas instalado en el IDE. Creo que Rob lo golpeó en la cabeza con las fuentes extraviadas en la cama con mis DCU. –

+0

@Justin: Tal vez solo puedas hacerlo con unos pocos que te encuentres ingresando el 98% del tiempo. – lkessler

+0

@Justin, @lkessler - esto es lo que suelo hacer con el "98%", pero solo he usado un pequeño número de componentes de terceros recientemente –

4

Solo para completar sus opciones: si sus bibliotecas por alguna razón deben compilarse con información de depuración (suelo usar todo con información de depuración, incluyendo VCL y RTL) y accidentalmente traza en un método que no le interesa , puede usar Shift + F8 para ejecutar hasta que el método regrese a su código.

Cuestiones relacionadas