Ay! qué mimados que os tienen las nuevas tecnologías a las nuevas generaciones. Cuando empezaron a nacer los depuradores, la gente se emocionó, porque volvían la depuración más cómoda... pero para lo único que han servido es para malacostumbrar a los programadores, que ya no saben depurar como antaño... ¿Qué ha pasado con el bellísimo arte de repasar a mano tiras y tiras de papel llenas de agujeros que representaban código máquina?
En fin, dejando de lado la retórica y la historia, he aquí unas nociones sobre cómo depurar sin depurador:
La base para la depuración 'a pelo' es el código de depuración. Para emplear esta técnica, necesitas una línea de este tipo al principio de tu código:
$debugging = true;
Esta variable la usarás para marcar a tu código si ha de mandar datos de depuración a la salida o no.
Si partes de un entorno como VBasic, estarás acostumbrado a las inspecciones. Pero vas a tener que prescindir de ellas al no tener depurador, así que tendrás que usar 'trazas' que, de hecho, son el 'abuelo' de las inspecciones. La pega de una traza es que no puedes contemplarla en todo momento, sino que has de realizar consultas finitas, en los puntos claves del código. Aunque puedes 'trazar a mano' como en este código:
if ($debugging) { echo "<!-- var=" . $var . "-->\n";}
es mucho más comodo abusar de la versatilidad de PHP, usando una función de este tipo (nota: los ···> hacen de tabuladores, para mayor legibilidad):
function traza ($var) { //$var no es la variable a trazar, sino su nombre!
···>if ($debugging){
···>···>echo "<!--" . $var . "=" . $GLOBALS[$var] . "-->\n";
···>}
}
Con esto, cuando quieras inspeccionar una variable, por ejemplo una que se llame $codigo, haz una llamada como esta:
traza('codigo');
el nombre de la variable lo has de pasar como cadena de texto, no la variable a pelo. La matriz $GLOBALS[] requiere una cadena con el nombre de la variable, y así también se puede indicar el nombre, porque solo el valor no resulta muy útil.
Además de trazar variables, puedes usar códigos como el del primer ejemplo (el que no usa la función traza) para obtener información original. Por ejemplo, si al principio de cada función pones algo como esto:
if ($debugging) { echo "<!-- Llamada a nombrefuncion-->\n";}
y luego esto al final (justo antes de retornar el valor, o no se ejecutará):
if ($debugging) { echo "<!-- nombrefuncion devuelve" . datosquesedevuelven ."-->\n";}
entonces conseguirás algo que emula la 'pila de llamadas' del depurador de VBasic.
El último punto son los puntos de interrupcion y las modificaciones de código 'en vivo'. Esto es muy dificil de implementar sin depurador y, por lo general, causa más complicaciones de las que resuelve.
A medida que practiques un poco con esta técnica, le acabarás cogiendo el gusto, hasta el punto que cuando depures en VBasic usarás Debug.Print en lugar de inspecciones :P Con este método se puede detectar y corregir cualquier error, aunque lleva un poco más de esfuerzo que con depurador; y irás aprendiendo más de cada error que corrigas que con los métodos más 'gandules'.
Así que suerte y ánimo
Atentamente,
Herenvardö