Attention! Your ePaper is waiting for publication!
By publishing your document, the content will be optimally indexed by Google via AI and sorted into the right category for over 500 million ePaper readers on YUMPU.
This will ensure high visibility and many readers!
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 124 — #162 ✐ Capítulo 3. C <strong>en</strong> <strong>C++</strong> 3.9. Consejos para depuración En un <strong>en</strong>torno ideal, habrá un depurador excel<strong>en</strong>te disponible que hará que el comportami<strong>en</strong>to de su programa sea transpar<strong>en</strong>te y podrá descubrir cualquier error rápidam<strong>en</strong>te. Sin embargo, muchos depuradores ti<strong>en</strong><strong>en</strong> puntos débiles, y eso puede requerir t<strong>en</strong>ga que añadir trozos de código a su programa que le ayud<strong>en</strong> a <strong>en</strong>t<strong>en</strong>der que está pasando. Además, puede que para la plataforma para la que esté desarrollando (por ejemplo <strong>en</strong> sistemas empotrados, con lo que yo tuve que tratar durante mis años de formación) no haya ningún depurador disponible, y quizá t<strong>en</strong>ga una realim<strong>en</strong>tación muy limitada (por ejemplo, un display de LEDs de una línea). En esos casos debe ser creativo a la hora de descubrir y repres<strong>en</strong>tar información acerca de la ejecución de su programa. Esta sección sugiere algunas técnicas para conseguirlo. 3.9.1. Banderas para depuración Si coloca el código de depuración mezclado con un programa, t<strong>en</strong>drá problemas. Empezará a t<strong>en</strong>er demasiada información, que hará que los errores sean difíciles de aislar. Cuando cree que ha <strong>en</strong>contrado el error empieza a quitar el código de depuración, sólo para darse cu<strong>en</strong>ta que necesita ponerlo de nuevo. Puede resolver estos problemas con dos tipos de banderas: banderas de depuración del preprocesador y banderas de depuración <strong>en</strong> ejecución. Banderas de depuración para el preprocesador Usando el preprocesador para definir (con #define) una o más banderas de depuración (preferiblem<strong>en</strong>te <strong>en</strong> un fichero de cabecera), puede probar una bandera usando una s<strong>en</strong>t<strong>en</strong>cia #ifdef e incluir condicionalm<strong>en</strong>te código de depuración. Cuando crea que la depuración ha terminado, simplem<strong>en</strong>te utilice #undef la bandera y el código quedará eliminado automáticam<strong>en</strong>te (y reducirá el tamaño y sobrecarga del fichero ejecutable). Es mejor decidir los nombres de las banderas de depuración antes de empezar a contruir el proyecto para que los nombres sean consist<strong>en</strong>tes. Las banderas del preprocesador tradicionalm<strong>en</strong>te se distingu<strong>en</strong> de las variables porque se escrib<strong>en</strong> todo <strong>en</strong> mayúsculas. Un nombre habitual es simplem<strong>en</strong>te DEBUG (pero t<strong>en</strong>ga cuidado de no usar NDEBUG, que está reservado <strong>en</strong> C). La secu<strong>en</strong>cia de s<strong>en</strong>t<strong>en</strong>cias podrías ser: #define DEBUG // Probably in a header file //... #ifdef DEBUG // Check to see if flag is defined /* debugging code here */ #<strong>en</strong>dif // DEBUG La mayoría de las implem<strong>en</strong>taciones de C y <strong>C++</strong> también le permitirán definir y eliminar banderas (con #define y #undef) desde línea de comandos, y de ese modo puede recompilar código e insertar información de depuración con un único comando (preferiblem<strong>en</strong>te con un makefile, una herrami<strong>en</strong>ta que será descrita <strong>en</strong> breve). Compruebe la docum<strong>en</strong>tación de su <strong>en</strong>torno si necesita más detalles. Banderas para depuración <strong>en</strong> tiempo de ejecución En algunas situaciones es más conv<strong>en</strong>i<strong>en</strong>te activar y desactivar las banderas de depuración durante la ejecución del programa, especialm<strong>en</strong>te cuando el programa se ejecuta usando la línea de comandos. Con programas grandes resulta pesado re- 124 ✐ ✐ ✐ ✐
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 125 — #163 ✐ 3.9. Consejos para depuración compilar sólo para insertar código de depuración. Para activar y desactivar código de depuración dinámicam<strong>en</strong>te cree banderas booleanas. //: C03:DynamicDebugFlags.cpp #include #include using namespace std; // Debug flags ar<strong>en</strong>’t necessarily global: bool debug = false; int main(int argc, char* argv[]) { for(int i = 0; i < argc; i++) if(string(argv[i]) == "--debug=on") debug = true; bool go = true; while(go) { if(debug) { // Debugging code here cout