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)
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$'253257$%/('(&Ï',*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.
3URFHVRGHJHQHUDFLyQGHFyGLJRGHSXUDEOH
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
)LJXUD3URFHVRGHJHQHUDFLyQGHFyGLJRHMHFXWDEOH
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
)LJXUD3URFHVRGHJHQHUDFLyQGHFyGLJRGHSXUDEOH
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.
6WDEV1HFHVLGDGGHODLQIRUPDFLyQGHGHSXUDFLyQ
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:
$³'HOFHUGRPHJXVWDKDVWDORVDQGDUHV´
$ (
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)RUPDWRJHQHUDO
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 ³FDGHQDGHVWDE´
La
FDGHQDGHVWDE
iene dos pa es di e enciables:
•
&ODVHGHREMHWR
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.
•
'HVFULSWRUGHWLSR
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,PSRUWDQFLDGHXQVLVWHPDGHWLSRVDPSOLR
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:
'HVFRPSRVLFLyQGHWLSRV
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 ³8XHLDDLF´
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´
³XHLD´
³DLF´
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: , ;”
)LFKHURGHVWDEV
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.