scieee Open visual document viewer

Construcción de un depurador portable de código. Proceso de generación de código depurable. Información de depuración (LSI-2000-03)

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

Abstract

En este segundo artículo empezaremos a dar las nociones necesarias para construir un depurador de código. El depurador será una biblioteca en ANSI C que podrá ser utilizado por cualquier compilador que genere código C. Se verá la necesidad de tener información acerca del programa que se pretende depurar y se definirá el formato a usar para definir ésta información.

Full text

& 216758&&,Ï1'(81'(385$'253257$%/('(&Ï',*2  3 52&(62'(*(1(5$&,Ï1'(&Ï',*2'(385$%/(  , 1)250$&,Ï1'('(385$&,Ï1 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 segundo a ículo empeza emos a da las nociones necesa ias pa a cons ui un depu ado de código. El depu ado se á una biblio eca en ANSI C que pod á se u ilizado po cualquie compilado que gene e código C. Se e á la necesidad de ene in o mación ace ca del p og ama que se p e ende depu a y se de ini á el o ma o a usa pa a de ini és a in o mación. 3URFHVRGHJHQHUDFLyQGHFyGLJRGHSXUDEOH El p oceso de gene ación de código ejecu able pa a un compilado que gene a código C como código obje o, queda e lejado en la siguien e igu a: uen e Compilado Código C Compilado Cejecu able )LJXUD3URFHVRGHJHQHUDFLyQGHFyGLJRHMHFXWDEOH El esquema an e io queda modi icado si que emos gene a código depu able. A con inuación, en la igu a 2., se mues a el p oceso de gene ación de código depu able que debe lle a a cabo un compilado que gene e código C in e medio, es deci , nues o caso. Fuen e Compilado Opción gene a in o mación pa a el debugge Código-C con llamadas a las u inas del debugge desc ipción s abs Compilado C debug.lib debug.h ejecu able lis o pa a depu a )LJXUD3URFHVRGHJHQHUDFLyQGHFyGLJRGHSXUDEOH Como se puede obse a , es necesa io habili a la opción que pe mi e que el compilado gene e in o mación pa a el p oceso de depu ación; és a in o mación la si úa el compilado en un iche o dis in o al del código obje o y se usa únicamen e en la ase de inicialización del depu ado . Además de la in o mación de desc ipción de s abs, el compilado iene que inse a en el código C llamadas a la unciones del depu ado , es as unciones se e án en a ículos pos e io es, pe o podemos adelan a que pe mi i án inicializa el depu ado , asigna a los dis in os obje os la di ección donde se encuen an en memo ia, ab i un nue o ámbi o, ce a un ámbi o, aza el p og ama y libe a la memo ia ocupada po el depu ado . Una ez gene ado el código C po el compilado , necesi amos cons ui un ejecu able de ini i o con un compilado de C; és e a chi o ejecu able se ob iene compilando el código C gene ado, y enlazándolo con la biblio eca que cons i uye el depu ado . Es deci , el depu ado que p e endemos cons ui se á una biblio eca con una se ie de unciones, que enlazada con el código C gene ado po un compilado pe mi i á ob ene p og amas au odepu ables. 6WDEV1HFHVLGDGGHODLQIRUPDFLyQGHGHSXUDFLyQ Pa a e po qué es necesa io dispone de in o mación de depu ación amos a e lo que ha ía un de e minado depu ado de código pa a pode isualiza el alo de una a iable. Supongamos que es amos depu ando el siguien e p og ama: PROGRAM INCREMENTAR; VAR A:INTEGER; BEGIN A := A + 1; END. Supongamos que el usua io p egun a po el alo de la a iable “ $´ an es de que se p oduzca el inc emen o. El depu ado debe ía sabe que “ $´ es una a iable, además si que emos hace uso de “ $´ en exp esiones, o asigna le un de e minado alo , debe íamos conoce su ipo, así pod ía sabe si la exp esión o asignación es co ec a o no. E i a íamos de es a o ma exp esiones del ipo: $³'HOFHUGRPHJXVWDKDVWDORVDQGDUHV´ $ ( Po lo an o, pa a que el depu ado pueda ejecu a los comandos del usua io, es necesa io que enga cie a in o mación de los a chi os uen es que a a depu a . A endiendo al ejemplo an e io , de la a iable “ $´ nos in e esa ía sabe que se a a de una a iable y que su ipo es en e o, además debemos conoce la di ección de memo ia en la que se encuen a si que emos usa su alo . La in o mación an e io pod ía eni dada con la siguien e cadena de ca ac e es (s ab): “ 9L ”, donde 9 indica que es una a iable e L que el ipo de la a iable es en e o. Podemos gene aliza , diciendo que pa a que el depu ado pueda ealiza sus unciones ípicas, según se ejecu a el p og ama que que emos depu a , és e debe de conoce al p og ama, es deci , iene que dispone de in o mación de odos los obje os a los que el usua io, an o explíci a como implíci amen e pueda accede . La in o mación de depu ación se á gene ada po el compilado y se le pasa á al depu ado a a és de un iche o. 6WDEV)RUPDWRJHQHUDO Una ez explicado el p oceso gene al de gene ación de código depu able y is o la necesidad de ene in o mación de depu ación, pasa emos a desc ibi el o ma o de los s abs, es deci , como podemos desc ibi median e simples cadenas de ca ac e es los dis in os elemen os del p og ama que son de in e és pa a el depu ado . La idea de especi ica median e una simple cadena de ca ac e es el s ab que desc ibe un obje o de nues o p og ama, ae á como consecuencia más inmedia a, la implemen ación po pa e del depu ado de un au óma a e icien e que la econozca. Las cadenas de s abs una ez econocidas se án ans o madas a á boles de sin axis abs ac as. De es a o ma e i a emos el ene que a analiza la cadena de s ab de un de e minado obje o cada ez que el usua io in oduzca un comando, ya que se iene es a in o mación es uc u ada con los á boles. Cabe menciona que las posibilidades que o ecen los s abs son eno mes en cuan o a la po encia que se le puede da al depu ado . Posiblemen e, pa a implemen a mejo as u u as en nues o depu ado haya que modi ica y/o añadi cadenas de s abs que hagan más ácil dichas mejo as. El o ma o gene al usado se á: 1RPEUHBREMHWR ³FDGHQDGHVWDE´ La FDGHQDGHVWDE iene dos pa es di e enciables: • &ODVHGHREMHWR Nos dice si el obje o es una a iable, una cons an e, un ipo de inido po el usua io, una u ina o un pa áme o. • 'HVFULSWRUGHWLSR Se e ie e al ipo conc e o del obje o, es deci , qué conjun o de alo es puede pe mi i . El sis ema de ipos del depu ado debe de se lo más amplio posible pa a pode depu a una mayo can idad de p og amas. Es deci , se debe con empla los ipos más ecuen es en cualquie lenguaje de p og amación. De no exis i un sis ema de ipos ela i amen e amplio, pod íamos encon a nos con que no podemos depu a algún p og ama. En la igu a 3. podemos e g á icamen e és a idea: a) El p og ama puede se depu ado Sis ema de ipos del Depu ado Tipos usados po el p og ama b) El p og ama no puede se depu ado1 Sis ema de ipos del Depu ado Tipos usados po el p og ama c) El p og ama no puede se depu ado Sis ema de ipos del Depu ado Tipos usados po el p og ama )LJXUD,PSRUWDQFLDGHXQVLVWHPDGHWLSRVDPSOLR La g amá ica conc e a, en o ma o YACC, que se p opone pa a almacena la in o mación de depu ación es la siguien e2: s ab : obje o ipo | ipo ; obje o : ’V’ /* Va iable */ | ’C’ /* Cons an e */ | ’P’ /* Pa áme o */ | 'U' /* Tipo de inido po usua io */ | 'R' /* Ru ina */ ; ipo : 'i' /* En e o */ | 'b' /* By e */ | ' ' /* Real */ | 'o' /* Booleano */ | 'c' /* Cha */ | ' ' /* Void */ | 's' DIG /* S ing, DIG ep esen a la longi ud de la cadena */ | 'a' ipo ';' DIG ',' DIG ';' ipo /* A ay, el p ime ipo es el del indice y el segundo es el ipo base*/ /* DIG ‘,’ DIG hace e e encia a los lími es del a ay */ | 'e' '+' lis a_ alo es ';' /* Enume acion */ | ' ' ':' lis a_campos_ eg ';' /* Regis o */ | 'u' ':' lis a_campos_un ';' /* Union */ | 'p' ipo /* Pun e o*/ | '$' DIG /* Descomposicion de Tipo */ ; lis a_ alo es : ID ',' DIG 1 Cuando decimos que el p og ama no puede se depu ado, lo que ealmen e es amos diciendo es que no pod emos accede usando el depu ado a los obje os cuyo ipo no se encuen e con emplado en el sis ema de ipos del depu ado . Pe o sí pod emos abaja con el es o de obje os cuyos ipos es én englobados en el sis ema de ipos del depu ado . 2 Los iden i icado es en mayúsculas y los ca ac e es en e comillas deno an a los okens de la g amá ica. Los iden i icado es en minúscula son los símbolos no e minales, los cuales de i an en o os símbolos no e minales ó en okens median e las eglas de p oducción de la g amá ica. | lis a_ alo es ’:’ ID ’,’ DIG ; lis a_campos_ eg : campo_ eg | lis a_campos_ eg ’:’ campo_ eg ; lis a_campos_un : campo_un | lis a_campos_un ’:’ campo_un ; campo_ eg : ID ’,’ ipo | PAD /* Padding */ ; campo_un : ID ’,’ ipo ; De la g amá ica an e io es necesa io comen a a ios de alles:   'HVFRPSRVLFLyQGHWLSRV Dependiendo de la complejidad del ipo que se p e enda desc ibi median e la cadena de s ab, és a puede esul a más o menos la ga. Además, se dan casos en los que se decla an a iables que son del mismo ipo. Po ejemplo, conside a emos el ipo siguien e: TYPE T1 = UNION e : INTEGER; a : ARRAY [1..12] OF CHAR; END; La cadena de s ab que se gene a ía se ía: 7 ³8XHLDDLF´ Nos encon amos an e dos p oblemas que pueden hace ine icien e la u ilización de los s abs: en p ime luga , la longi ud de las cadenas de s abs pod ía se ela i amen e la gas y po an o di íciles de lee . Y en segundo luga , la edundancia que se p oduce al ene siemp e que gene a la misma cadena de s abs po cada obje o que se decla e de ese ipo. Pensando en es os p oblemas, el depu ado inco po a un mecanismo que nos pe mi e descompone la cadena de s abs en ozos, que pod emos eu iliza en cualquie pa e del iche o que con iene los s abs. Es e mecanismo se basa en de ini símbolos del ipo $n, donde n es un núme o en e o posi i o, mayo o igual que 1, que el depu ado conside e como una especie de mac o. Po ejemplo, pa a el caso an e io , pod íamos hace lo siguien e: 7 ³8´  ³XHLD´  ³DLF´ Con lo que consigui íamos: • Po un lado, esul a más in ui i a que en el caso de ene una sola cadena de s abs. • Po o o lado, aho a po cada a iable del ipo T1 sólo end emos que hace e e encia a $1.   3DGGLQJ Pa a los egis os, en ez de la desc ipción de un de e minado campo, pod ía apa ece un de e minado núme o de ‘*’ indicando que el compilado es á alineando los da os en memo ia3. Es o lo consiguen con by es de elleno o padding. El núme o de as e iscos nos indica el núme o de by es de elleno o padding que es á usando el compilado pa a alinea los da os, és a can idad la end á que ene en cuen a el depu ado a la ho a de accede a los campos del egis o, pa a pode abaja co ec amen e con los obje os de ipo egis o. Veamos lo an e io g á icamen e, suponiendo lo siguien e: • P ocesado con una palab a de 4 by es. • Tamaño de un ca ac e : 1 by e. • Tamaño de un en e o : 2 by es. • Tamaño de un eal : 4 by es. • Cada cuad ado del siguien e g á ico ep esen a 1 by e. Ve emos lo que ocu e con la siguien e decla ación: 9$5 eg: 5(&25' c:CHAR; i:INTEGER; :REAL; (1' ; a) Compilado que hace uso de Padding b) Compilado que no hace uso de Padding c * * * i i * * c i i Reg “V :c,c:***:i,i:**: , ;” eg “V :c,c:i,i: , ;” )LFKHURGHVWDEV Ya se ha is o pa a qué obje os y de qué o ma se de inen los s abs de un p og ama pa a que el depu ado enga in o mación de ellos. Aho a p e endemos indica el o ma o del iche o donde amos a almacena oda es a in o mación (los s abs), Además e emos como nos a a apo a una nue a in o mación, es o es in o mación sob e los ámbi os. Las eglas de ámbi o (scoping) indican donde una a iable es álida, dónde se c ea y dónde se anula. Una a iable pod á usa se únicamen e cuando es á den o de su ámbi o (el ámbi o pa a la que ue de inida). Los ámbi os se pueden anida , de o ma que, po ejemplo, una de e minada a iable de inida en un ámbi o supe io puede queda ocul a po o a una a iable de igual nomb e de inida en o o ámbi o in e io . 3 La alineación de da os en memo ia es una écnica de op imización muy u ilizada po los compilado es ac uales. Al alinea los da os omando como amaño base la palab a del compu ado , se consigue elocidad en los accesos a memo ia y ans e encias de da os; e i ándose ambién los accesos desalineados. El depu ado iene que ene en cuen a en odo momen o el ámbi o en que se encuen a y las a iables que son isibles, pa a ello ha á uso de una pila in e na en la que i emos apilando y desapilando la in o mación del ámbi o en el que hayamos en ado o salido espec i amen e. La in o mación de cada ámbi o end á dada po una abla de símbolos donde almacena emos pa a cada obje o, el á bol co espondien e a su s ab y la di ección de memo ia en la que se encuen a (pa a pode accede , asigna le alo es y ope a con su con enido). El o ma o del iche o pod ía se el siguien e: [NOMBRE_AMBITO1] nomb e_obje o1,1 “cadena_s ab1,1” “ iche o” línea columna nomb e_obje o1,2 “cadena_s ab1,2” “ iche o” línea columna ... [NOMBRE_AMBITO2] nomb e_obje o2,1 “cadena_s ab2,1” “ iche o” línea columna nomb e_obje o2,2 “cadena_s ab2,2” “ iche o” línea columna ... ... [NOMBRE_AMBITON] nomb e_obje oN,1 “cadena_s abN,1” “ iche o” línea columna nomb e_obje oN,2 “cadena_s abN,2” “ iche o” línea columna ... Según el o ma o an e io , es amos de iniendo odos los obje os, o denados según el ámbi o en el que se encuen a de inidos. Los nomb es de es os obje os son los iden i icado es usados pa a cada uno de ellos en el p og ama uen e. Pa a los nomb es de los ámbi os se pueden u iliza aquellos de las unciones y/o p ocedimien os que de inen dicho ámbi o. Si se die a el caso de que el lenguaje que se compila gene ase bloques de código que de inie an ambi os, el compilado debe ía gene a nomb es “a i iciales” pa a iden i ica dichos bloques. El p ime o de los ámbi os suele se un ámbi o de nomb e especial que iden i ica a los obje os que se de inen globalmen e ( a iables globales, ipos de inidos po el usua io globalmen e ...). Tan o " iche o", como “línea” y “columna”, son da os que el depu ado no u iliza. Solamen e se incluyen en el o ma o del iche o pa a que sean usados po o as he amien as, como pod ía se el caso del B owse . Ve emos a con inuación el iche o de s abs que se end ía que gene a pa a un p og ama que mues a en pan alla la abla de ac o iales. 1: PROGRAM TABLA_FACTORIAL; 2: VAR n:INTEGER; 3: 4: FUNCTION Fac o ial (nume o:INTEGER):REAL; 5: BEGIN 6: IF nume o=0 THEN 7: Fac o ial:=1 8: ELSE 9: Fac o ial:=nume o*Fac o ial(nume o-1); 10: END; 11: 12: BEGIN; 13: WRITELN(’NUMERO’:10,’FACTORIAL’:25); 14: WRITELN; 15: FOR n:=1 TO 20 DO 16: WRITELN(n:8,Fac o ial(n):27:0); 17: END. El p og ama saca po pan alla una abla de alo es y los ac o iales de esos alo es (desde 1 has a 20). El iche o de s abs se ía el siguien e: [PASCAL_MAIN] WRITELN “R ” n“Vi” Fac o ial “R ” [Fac o ial] nume o “Pi” Cabe des aca los siguien es de alles: • “PASCAL_MAIN” hace e e encia al p og ama p incipal del uen e en pascal. • La unción “WRITELN” se encuen a en una de las biblio ecas básicas que se suminis an con el compilado de Pascal; los diseñado es de compilado es pueden op a po no suminis a la in o mación de depu ación ni inse a las llamadas al depu ado en su código, lo que p o oca ía el no pode depu a las. Suminis a dos e siones, con in o mación de depu ación y llamadas al depu ado inse adas en su código, y sin in o mación de depu ación. Con es a al e na i a el usua io pod ía escoge en e pe mi i o no pe mi i la depu ación de es e ipo de unciones.