Depurador Integrado
HarbourBuilder incluye un depurador completamente integrado que se ejecuta en proceso mediante el
formato de bytecode .hrb. Sin proceso de depurador externo, sin sobrecarga de comunicacion entre procesos
— el depurador es parte del propio Harbour VM, proporcionando una experiencia de depuracion sin fisuras
con control total sobre la ejecucion.
A diferencia de los depuradores tradicionales que se adjuntan a un proceso en ejecucion, el depurador de HarbourBuilder opera dentro del mismo Harbour VM. Esto significa latencia cero para la inspeccion de variables, hits de puntos de interrupcion instantaneos e informacion precisa de la pila de llamadas en todo momento.
Arquitectura
Compilacion para Depuracion
Para generar bytecode depurable, compila con estas banderas:
| Bandera | Proposito |
|---|---|
-gh | Generar simbolos de depuracion (numeros de linea, nombres de variables, informacion de alcance) |
-b | Generar archivo de bytecode .hrb en lugar de codigo fuente C |
harbour miapp.prg -gh -b
El archivo .hrb contiene toda la informacion que el depurador necesita para mapear instrucciones de bytecode
de vuelta a lineas de codigo fuente, mostrar nombres de variables y reconstruir la pila de llamadas.
El Gancho de Depuracion: hb_dbg_SetEntry
En el nucleo del soporte de depuracion de Harbour esta la funcion gancho hb_dbg_SetEntry().
Esta funcion de retrollamada es invocada por el Harbour VM en cada instruccion de bytecode cuando el modo de depuracion esta activo,
permitiendo al IDE:
- Rastrear la linea de codigo fuente que se esta ejecutando
- Inspeccionar y modificar variables locales y estaticas
- Evaluar expresiones en el alcance actual
- Implementar operaciones de paso a paso, saltar y salir
- Verificar hits de puntos de interrupcion
Cuando Harbour ejecuta un archivo .hrb compilado con -gh, cada instruccion desencadena
una llamada a hb_dbg_SetEntry. El IDE registra su propia funcion de retrollamada mediante
hb_dbg_SetEntry(), recibiendo el archivo actual, numero de linea, nombre de funcion
y contexto de variables en cada paso.
Barra de Herramientas de Depuracion
La barra de herramientas de depuracion proporciona cinco controles de ejecucion esenciales:
| Icono | Atajo | Accion | Descripcion |
|---|---|---|---|
| ▶ | F5 | Ejecutar / Continuar | Iniciar ejecucion o continuar desde un punto de interrupcion |
| ⏸ | F6 | Pausar | Pausar la ejecucion en la linea actual |
| ↓ | F7 | Paso a paso (entrar) | Ejecutar la linea actual; si llama a una funcion, entrar en ella |
| → | F8 | Paso a paso (saltar) | Ejecutar la linea actual; saltar las llamadas a funciones |
| ■ | Shift+F5 | Detener | Terminar la sesion de depuracion |
Paneles Acoplables del Depurador
El depurador proporciona cinco pestanas acoplables que se pueden organizar segun tu flujo de trabajo:
| Pestana | Descripcion |
|---|---|
| Watch | Agrega expresiones para monitorear sus valores en tiempo real. Soporta expresiones Harbour como oForm:cTitle, aArray[1] y llamadas a funciones. |
| Locales | Muestra todas las variables locales en el alcance de la funcion actual, incluyendo sus tipos y valores actuales. Auto-expande arreglos y objetos. |
| Pila de Llamadas | Muestra la pila de llamadas completa con nombres de archivo, numeros de linea y nombres de funcion. Haz clic en cualquier marco para navegar a esa ubicacion de codigo fuente. |
| Puntos de Interrupcion | Lista de todos los puntos de interrupcion con archivo, linea, condicion y contador de hits. Habilitar/deshabilitar o eliminar puntos de interrupcion individuales. |
| Salida | Salida de consola de la aplicacion depurada, incluyendo salida ? y ?? , registros MsgInfo() y mensajes de traza de depuracion. |
Configurar Puntos de Interrupcion
Haz clic en el margen junto a cualquier numero de linea para alternar un punto de interrupcion. Los puntos de interrupcion se indican con un punto rojo:
- Punto de interrupcion estandar — pausa la ejecucion cuando se llega a la linea.
- Punto de interrupcion condicional — clic derecho en un punto de interrupcion para establecer una expresion Harbour; la ejecucion se pausa solo cuando la expresion evalua a
.T. - Punto de interrupcion por contador — pausar solo despues de que el punto de interrupcion haya sido alcanzado N veces.
Flujo de Trabajo de Sesion de Depuracion
- Compilar con banderas de depuracion — Presiona F9 para construir; el IDE agrega automaticamente
-gh -bal depurar. - Establecer puntos de interrupcion — Haz clic en el margen en las lineas donde deseas pausar.
- Iniciar depuracion — Presiona F5 o haz clic en el boton Ejecutar.
- Inspeccionar variables — Usa las pestanas Watch y Locales para examinar el estado.
- Paso a paso por el codigo — Usa F7 (Paso a paso entrando) o F8 (Paso a paso saltando) para avanzar.
- Navegar la pila de llamadas — Haz clic en los marcos del panel Pila de Llamadas para ver el contexto.
- Detener — Presiona Shift+F5 para terminar la sesion.
Puedes pasar el raton sobre cualquier variable en el editor de codigo mientras estas en pausa para ver su valor actual en una descripcion emergente. Esto funciona para variables locales, propiedades de objetos y elementos de arreglos.
Cobertura de Pruebas Unitarias
El subsistema del depurador esta cubierto por 16 pruebas unitarias que verifican:
| # | Prueba | Verifica |
|---|---|---|
| 1 | Punto de interrupcion establecido y alcanzado | La ejecucion se pausa en la linea correcta |
| 2 | Paso a paso entrando en llamada a funcion | El depurador entra en la funcion llamada |
| 3 | Paso a paso saltando llamada a funcion | El depurador salta el cuerpo de la funcion |
| 4 | Paso a paso saliendo de funcion | El depurador retorna al llamador |
| 5 | Inspeccion de variables locales | El panel Locales muestra nombres y valores correctos |
| 6 | Inspeccion de variables estaticas | Las variables estaticas son visibles y correctas |
| 7 | Evaluacion de expresion Watch | Las expresiones se evaluan con precision |
| 8 | Precision de la pila de llamadas | Los marcos de pila coinciden con la cadena de llamadas real |
| 9 | Punto de interrupcion condicional (verdadero) | Se pausa cuando se cumple la condicion |
| 10 | Punto de interrupcion condicional (falso) | No se pausa cuando no se cumple la condicion |
| 11 | Punto de interrupcion por contador | Se pausa solo despues de N hits |
| 12 | Habilitar/deshabilitar punto de interrupcion | Alternar funciona correctamente |
| 13 | Multiples puntos de interrupcion | Todos los puntos de interrupcion son respetados |
| 14 | Inspeccion de elementos de arreglo | Los elementos del arreglo se muestran correctamente |
| 15 | Inspeccion de propiedades de objeto | Las propiedades del objeto son navegables |
| 16 | Limpieza de sesion de depuracion | Los recursos se liberan al detener |
Resumen de Atajos del Depurador
| Atajo | Accion |
|---|---|
| F5 | Ejecutar / Continuar |
| F6 | Pausar |
| F7 | Paso a paso (entrar) |
| F8 | Paso a paso (saltar) |
| Shift+F5 | Detener depuracion |
| F9 | Alternar punto de interrupcion en la linea actual |
| Ctrl+Shift+F9 | Limpiar todos los puntos de interrupcion |
Despues de depurar, usa Compilar y Ejecutar para compilar una version de lanzamiento
sin simbolos de depuracion para distribucion. Las versiones de lanzamiento son mas pequenas y rapidas ya que omiten
las banderas -gh -b.