scieee Open visual document viewer

Construcción de un depurador portable de código. Funciones de la biblioteca. Ejemplo de uso del depurador (LSI-2000-03)

Arjona Fernández, José Luis; Prieto Pérez, José M.; Corchuelo Gil, Rafael

Abstract

En este cuarto artículo veremos las funciones que componen la biblioteca que constituye el depurador, veremos cual es el significado de cada una de estas funciones y cuando se aconseja su uso. Para finalizar veremos para un pequeño ejemplo el comportamiento del depurador.

Full text

& 216758&&,Ï1'(81'(385$'253257$%/('(&Ï',*2  ) 81&,21(6'(/$%,%/,27(&$  ( -(03/2'(862'(/'(385$'25  José L. A jona Fe nández, José M. P ie o Pé ez, R. Co chuelo Gil Dp o. de Lenguajes y Sis emas In o má icos Facul ad de In o má ica y Es adí ica Uni e sidad de Se illa Web: h p://www.lsi.us.es En es e cua o a ículo e emos las unciones que componen la biblio eca que cons i uye el depu ado , e emos cual es el signi icado de cada una de es as unciones y cuando se aconseja su uso. Pa a inaliza e emos pa a un pequeño ejemplo el compo amien o del depu ado . )XQFLRQHVGHODELEOLRWHFDGHGHSXUDFLyQ Cómo se comen o en el segundo de los a ículos, el depu ado de código es á cons i uido po una biblio eca ANSI C. Pues aho a es el momen o de comen a las unciones necesa ias pa a hace que el p og ama sea au odepu able. Además de gene a los s abs, el compilado debe de in e cala en el código C gene ado, llamadas a las u inas del depu ado . En es e apa ado de alla emos el signi icado de cada una de es as unciones que el compilado iene que inse a . Los p o o ipos de las u inas que suminis a la biblio eca, son las siguien es: oid debug_ini (cha * ich_s abs); oid debug_link (cha *id, oid *di ); oid debug_open (cha *nomb e_ambi o); oid debug_close ( oid); oid debug_end ( oid); oid debug_ ace (unsigned num_linea, cha * ich_ uen e); Comen a emos aho a el sen ido de cada una de ellas: ½ GHEXJBLQLW Es la u ina de inicialización del depu ado , es deci , se lee el iche o de los s abs, y se inicializan odas las a iables in e nas usadas po el mismo. Sin una llamada a es a u ina, nada unciona á en el depu ado . Po lo an o se á la p ime a unción que se ejecu a á de la lib e ía y del p og ama uen e. Como pa áme o de en ada se le pasa el nomb e del iche o donde es án almacenados los s abs. La in o mación de s abs, después de analiza léxica y sin ác icamen e el iche o de s abs, se á almacenada en o ma de á boles, o ganizada en ablas de símbolos (Una abla de símbolos pa a cada ámbi o). Es deci , end emos en cada abla de símbolos una en ada po cada elemen o del p og ama y pa a cada uno de es os elemen os almacena emos en o ma de á bol la in o mación de depu ación (s ab). ½ GHEXJBOLQN Pe mi e asocia a una a iable, cons an e o pa áme o una di ección de memo ia. Es necesa io que se le asigne una di ección a odos es os obje os pa a que el depu ado conozca su posición en memo ia y pueda abaja con ellos (calcula exp esiones, modi ica alo es, ...). Lo que ha íamos se ía ac ualiza en la abla de símbolos co espondien e un campo que ha ía e e encia a la di ección de ese elemen o. Si no se usa co ec amen e es a unción, el depu ado accede ía a posiciones de memo ia que no se co esponde al obje o que es amos es udiando, lo que p o oca ía e ec os imp edecibles. El luga co ec o pa a coloca las llamada a GHEXJBOLQN es, den o de cada ámbi o, an es de la p ime a llamada a la unción GHEXJBWUDFH pa a ese ámbi o y despúes de la llamada a GHEXJBRSHQ 1. Los pa áme os, pa a pode llama la son los siguien es: en p ime luga la cadena de ca ác e es que iden i ica a ese obje o, seguidamen e se le da á la di ección de memo ia en la que se encuen a. ½ GHEXJBRSHQ Se u iliza pa a especi ica al depu ado que se ab e un nue o ámbi o. En ella lo que hacemos es apila in o mación sob e dicho ámbi o en la pila de ablas de símbolos in e na del depu ado . Es a ca ac e ís ica nos pe mi i á sopo a el anidamien o es á ico2 que poseen algunos lenguajes. Como pa áme o acep a la cadena que iden i ica al ámbi o en el iche o de s abs. ½ GHEXJBFORVH Cie a el ámbi o ac ual, po lo an o es necesa io llama a es a unción cada ez que se sale de un ámbi o. En ella desapilamos la in o mación ace ca de ese ámbi o que apilabamos cuando se llamó a la u ina con GHEXJBRSHQ . El pa áme o que oma, es la cadena de ca ac e es que hace e e encia al nomb e del ámbi o del que se es á saliendo. ½ GHEXJBHQG Llamada que se ealiza al inal del p og ama y su obje i o es únicamen e libe a la memo ia ocupada po las es uc u as in e nas del depu ado . ½ GHEXJBWUDFH Es la llamada que se enca ga de la aza del p og ama, es deci , se enca ga á de decidi si se iene que pa a el p og ama en ejecución pa a que el usua io pueda in oduci algún comando o si 1 El lec o pod ía pensa en hace las llamadas a GHEXJBOLQN en o o luga , po ejemplo, an es de hace la llamada a GHEXJBRSHQ , pe o en ese caso end íamos p oblemas a la ho a de depu a unciones ecu en es. Además si aún no se ha abie o el ámbi o, ¿Cómo se encuen a el símbolo?. 2 El anidamien o es á ico hace e e encia a la p opiedad que ienen algunos lenguajes de p og amación (cómo PASCAL, MODULA..), po la que den o de un p ocedimien o ó unción se pueden de ini o os p ocedimien os y unciones, siendo isibles únicamen e pa a ese ámbi o. po el con a io iene que segui ejecu ando el p og ama. También se enca ga á de analiza los comandos del usua io y mos a á el esul ado de la e aluación de dichos comandos. Veamos aho a un ejemplo comple o y un ejemplo de aza sob e él con el depu ado ya cons uido: Con es e ejemplo p e endemos cons ui la unción de Eule : “ 'DGR XQ Q~PHUR HQWHUR PD RUTXHFHUR$ODIXQFLyQGH(XOHUGHYXHOYHHOQ~PHURGHHQWHURVSRVLWLYRVLQIHULRUHVD$ TXH DGHPiVVRQSULPRVFRQ$ ”. Pa a sabe si dos núme os son p imos, nos basa emos en la siguien e p opiedad: “ 'RVQ~PHURVVRQSULPRVHQWUHV FXDQGRVXPi[LPRFRP~QGLYLVRUHVODXQLGDG ”. Pa a implemen a la unción máximo común di iso usa emos el algo i mo de Euclides. A con inuación mos amos el p og ama que hace lo an e io en PASCAL (Eule .pas): 1: PROGRAM FUNCION_DE_EULER; 2: 3: VAR nume o:INTEGER; 4: 5: FUNCTION Mcd(p,q:INTEGER):INTEGER; 6: VAR es o:INTEGER; 7: BEGIN 8: REPEAT 9: BEGIN 10: es o:= p MOD q; 11: p:=q; 12: q:= es o; 13: END; 14: UNTIL es o=0; 15: mcd:=p; 16: END; 17: 18: FUNCTION Eule (x:INTEGER):INTEGER; 19: VAR i,con ado :INTEGER; 20: BEGIN 21: con ado :=0; 22: FOR i:=1 TO x-1 DO 23: IF Mcd(x,i)=1 THEN 24: con ado :=con ado +1; 25: Eule :=con ado ; 26: END; 27: 28: BEGIN 29: WRITELN(’ NUMERO - FUNCION DE EULER’); 30: WRITELN; 31: nume o:=81; 32: WRITELN(nume o,’ - ’,Eule (nume o)); 33: END. El iche o de s abs que end ía que gene a el compilado se ía (Eule .s b): [PASCAL_MAIN] WRITELN "R " nume o "Vi" Mcd "Ri" Eule "Ri" [Mcd] p "Pi" q "Pi" es o "Vi" [Eule ] x "Pi" i "Vi" con ado "Vi" El iche o de código C, con las llamadas a la biblio eca del depu ado inse adas se ía (Eule .c): #include <s dio.h> #include "debug.h" in nume o; oid PASCAL_MAIN( oid); in Mcd(in ,in ); in Eule (in ); oid main ( oid) { debug_ini ("eule .s b"); PASCAL_MAIN(); debug_end(); e u n; } oid PASCAL_MAIN( oid) { debug_open("PASCAL_MAIN"); debug_link("nume o", &nume o); debug_ ace(29,"eule .pas"); p in (" NUMERO - FUNCION DE EULER"); p in (" n"); debug_ ace(30,"eule .pas"); p in (" n"); debug_ ace(31,"eule .pas"); nume o=81; debug_ ace(32,"eule .pas"); p in ("%d - %d",nume o,Eule (nume o)); p in (“ n”); debug_ ace(33,"eule .pas"); debug_close(); e u n; } in Mcd(in p,in q) { in es o; debug_open("Mcd"); debug_link(" es o",& es o); debug_link("p",&p); debug_link("q",&q); do { debug_ ace(8,"eule .pas"); debug_ ace(10,"eule .pas"); es o= p % q; debug_ ace(11,"eule .pas"); p = q; debug_ ace(12,"eule .pas"); q = es o; } while ( es o!=0); debug_ ace(15,"eule .pas"); debug_close(); e u n p; } in Eule (in x) { in i,con ado ; debug_open("Eule "); debug_link("i",&i); debug_link("con ado ",&con ado ); debug_link("x",&x); debug_ ace(21,"eule .pas"); con ado = 0; o (i=1;i<=(x-1);i++) { debug_ ace(22,"eule .pas"); debug_ ace(23,"eule .pas"); i (Mcd(x,i)==1) { debug_ ace(24,"eule .pas"); con ado = con ado + 1; } } debug_ ace(25,"eule .pas"); debug_close(); e u n con ado ; } Vamos a usa el depu ado : Depu ado simbólico de código po able. Ve sión 1.1 Copy igh (C) 1998. José Manuel P ie o Pé ez y José Luis A jona Fe nández Tu o : Ra ael Co chuelo Gil. Es e p og ama iene sin ningún ipo de GARANTIA; pa a ob ene más de alles eclea 'show w'. Es g a ui o y se e pe mi e y ag adece que lo edis ibuya bajo cie as condiciones; eclea 'show c' pa a más de alles. * Ejecu emos en p ime luga algunas ins ucciones: 29: WRITELN(' NUMERO - FUNCION DE EULER'); (eule .pas:29)? nex NUMERO - FUNCION DE EULER 30: WRITELN; (eule .pas:30)? nex 31: nume o:=81; (eule .pas:31)? nex 32: WRITELN(nume o,' - ',Eule (nume o)); * Vamos a cambia el alo del núme o al que se le calcula la unción de Eule : (eule .pas:32)? wa ch nume o (En e o) 81 (eule .pas:32)? se nume o = nume o - 71 (eule .pas:32)? wa ch nume o (En e o) 10 * ¿Po qué línea íbamos? (eule .pas:32)? line 32: WRITELN(nume o,' - ',Eule (nume o)); * ¿Qué es el obje o Eule ? (eule .pas:32)? wha is Eule Ru ina que de uel e En e o * En emos en la unción Eule (eule .pas:32)? nex 21: con ado :=0; * Vamos a ob ene un poco más de in o mación: (eule .pas:21)? wha is i Va iable de ipo En e o (eule .pas:21)? wha is x Pa ame o de ipo En e o * Nos pa a emos en la úl ima i e ación del bucle FOR exis en e en el cue po de la unción * Eule : (eule .pas:21)? b eak #22 i==x-1 (eule .pas:21)? b eak Lis a B eakpoin s [eule .pas]. * linea #22 1: (i==(x-1)) (eule .pas:21)? un 22: FOR i:=1 TO x-1 DO * Veamos que e dade amen e es la úl ima i e ación: (eule .pas:22)? wa ch i (En e o) 9 (eule .pas:22)? wa ch x-1 (En e o) 9 * En emos en Mcd: (eule .pas:22)? nex 23: IF Mcd(x,i)=1 THEN (eule .pas:23)? nex 8: REPEAT * Veamos que es lo que de uel e la unción Mcd: (eule .pas:8)? b eak #15 (eule .pas:8)? un 15: mcd:=p; (eule .pas:15)? wa ch p (En e o) 1 *Po an o se iene que i po la ama e dade a del condicional IF que es á en la unción * Eule : (eule .pas:15)? nex 24: con ado :=con ado +1; * Exac amen e, aho a a po el esul ado inal! (eule .pas:24)? un 10 - 4