projman/hlp/fr/tcl/trace.htm

45 lines
7.8 KiB
HTML
Raw Normal View History

2015-10-19 13:27:31 +03:00
<HTML><HEAD>
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
</HEAD>
<BODY>
<div><H3><b>trace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Commandes Internes Tcl</b></H3></div>
<HR ALIGN="center">
<div><b>NOM</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">trace - suivre l'acc<63>s aux variables</div>
<div><br>
<div><b>SYNTAXE</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;"><b>trace </b><i>option</i> ?<i>arg arg ...</i>?&nbsp;
</div><br>
<div><b>DESCRIPTION</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Cette commande provoque l'ex<65>cution de certaines commandes Tcl quand certaines op<6F>rations sont appel<65>es. Actuellement, seule la trace de variables est mise en place. Les <i>options</i> valides (qui peuvent <20>tre abr<62>g<EFBFBD>es) sont:
<DL>
<DT><b>trace variable </b><i>name ops command</i></DT><DD>Provoque l'<27>x<EFBFBD>cution de la commande <i>command</i> <20> chaque fois que la variable <i>name</i> est acc<63>d<EFBFBD>e par un des moyens indiqu<71> par <i>ops</i>. <i>Name</i> peut faire r<>f<EFBFBD>rence <20> une variable simple, un <20>l<EFBFBD>ment d'un tableau , ou un tableau dans son entier (c'est <20> dire que&nbsp; <i>name</i> peut juste <20>tre le nom d'un tableau, sans parenth<74>ses d'index). Si <i>name</i> se r<>f<EFBFBD>re <20> un tableau entier, alors <i>command</i> est appel<65>e pour chaque manipulation d'un <20>l<EFBFBD>ment du tableau. Si la variable n'existe pas, elle sera cr<63><72>e mais n'aura pas de valeur, donc elle sera visible par les requ<71>tes <b>namespace which</b>, mais pas par les requ<71>tes <b>info exists</b>.<br>
<i>Ops </i>indique quelles op<6F>rations sont suivies, et comprend une ou plusieurs des lettres suivantes:
<DL>
<DT><b>r</b></DT><DD>Appelle <i>command </i><EFBFBD> chaque fois que la variable est lue.</DD>
<DT><b>w</b></DT><DD>Appelle <i>command</i> <20> chaque fois que la variable est <20>crite.
</DD>
<DT><b>u</b></DT><DD>Appelle <i>command</i> <20> chaque fois que la variable est annul<75>e. Les variables peuvent <20>tre annul<75>es explicitement avec la commande <b><u>unset</u></b>, ou implicitement <20> la fin des proc<6F>dures (toutes leurs variables locales sont annul<75>es). Les variables sont aussi annul<75>es quand des interpr<70>teurs sont d<>truits, mais les commandes de trace ne seront pas appel<65>es parce qu'il n'y aura pas d'interpr<70>teur pour les <20>x<EFBFBD>cuter.
</DD>
</DL><br>
Quand la trace se d<>clenche, trois arguments sont ajout<75>s <20> la fin de <i>command</i> , de telle sorte que la commande est r<>ellement appel<65>e comme suit:<br>
<i>command name1 name2 op</i><br>
<i>Name1</i> et <i>name2</i> donnent le(s) nom(s) pour la variable acc<63>d<EFBFBD>e: si la variable est scalaire, alors <i>name1</i> donne le nom de la variable et <i>name2</i> est une cha<68>ne vide; si la variable est un <20>l<EFBFBD>ment de tableau, <i>name1</i> donne le nom du tableau et <i>name2</i> l'index dans le tableau; si un tableau entier est d<>truit et que la trace <20>tait enregistr<74>e sur la totalit<69> du tableau et non sur un seul <20>l<EFBFBD>ment, alors <i>name1</i> donnera le nom du tableau et <i>name2</i> une cha<68>ne vide. <i>Name1</i> et <i>name2</i> ne sont pas n<>cessairement les m<>mes noms que celui utilis<69> dans la commande <b>trace variable</b>: la commande <b><u>upvar</u></b> permet <20> une proc<6F>dure de r<>f<EFBFBD>rencer une variable sous un nom diff<66>rent. <i>Op</i> indique quelle op<6F>ration est effectu<74>e sur la variable, et est l'une des trois lettres <b>r</b>, <b>w</b> ou <b>u</b> qui sont d<>finies plus haut.<br>
<i>Command </i>s'<27>x<EFBFBD>cute dans le m<>me contexte que le code qui a appel<65> l'op<6F>ration trac<61>e: si la variable <20>tait acc<63>d<EFBFBD>e comme partie d'une proc<6F>dure Tcl, alors <i>command</i> aura acc<63>s aux m<>mes variables locales que le code de la proc<6F>dure. Ce contexte peut <20>tre diff<66>rent de celui dans lequel la trace a <20>t<EFBFBD> cr<63><72>e. Si <i>command</i> appelle une proc<6F>dure (ce qui est le cas normal) alors la proc<6F>dure devra utiliser <b><u>upvar</u></b> ou <b><u>uplevel</u></b> si elle souhaite acc<63>der <20> la variable trac<61>e.&nbsp; Noter aussi que <i>name1</i> n'est pas n<>cessairement le m<>me que le nom utilis<69> pour d<>finir la trace sur la variable; des diff<66>rences peuvent se produire si l'acc<63>s est fait au travers d'une variable d<>finie par la commande <b><u>upvar</u></b>.<br>
Pour les traces en lecture et en <20>criture, <i>command</i> peut changer la variable pour modifier le r<>sultat de l'op<6F>ration trac<61>e. Si <i>command</i> modifie la valeur de la variable pendant une trace en lecture ou en <20>criture, alors la nouvelle valeur sera retourn<72>e comme <20>tant le r<>sultat de l'op<6F>ration trac<61>e. La valeur de retour de <i>command</i> est ignor<6F>e sauf dans le cas o<> elle retourne une erreur quelconque; dans ce cas l'op<6F>ration trac<61>e renvoie aussi une erreur avec le m<>me message d'erreur que celui renvoy<6F> par la commande appel<65>e par trace (ce m<>canisme peut <20>tre utilis<69> pour mettre en place des variables en lecture seule, par exemple). Pour les traces en <20>criture, <i>command</i> est appel<65>e apr<70>s que la valeur de la variable ait <20>t<EFBFBD> chang<6E>e; elle peut <20>crire une nouvelle valeur dans la variable pour forcer la valeur produite par l'op<6F>ration d'<27>criture. Pour mettre en place des variables en lecture seule, <i>command</i> aura <20> charge de&nbsp; remettre l'ancienne valeur dans la variable. <br>
Pendant que <i>command</i> s'<27>x<EFBFBD>cute durant une trace en lecture ou en <20>criture, les traces sur la variable sont temporairement d<>sactiv<69>es. Cela signifie que les lectures ou les <20>critures appel<65>es par <i>command</i> se produiront directement, sans invoquer <i>command</i>&nbsp; (ni aucune autre trace) une nouvelle fois. Cependant, si <i>command</i> annule la variable, les traces d'annulation seront appel<65>es. <br>
Quand une trace d'annulation est appel<65>e, la variable a d<>j<EFBFBD> <20>t<EFBFBD> d<>truite: elle appara<72>tra comme ind<6E>finie et ne poss<73>dant pas de traces. Si une annulation de variable se produit <20> cause d'une fin de proc<6F>dure, la trace sera appel<65>e dans le contexte de variables de la proc<6F>dure appelante: le contexte de pile de la proc<6F>dure qui s'est finie n'existera plus. Les traces ne seront pas d<>sactiv<69>es pendant les traces d'annulation, donc si une commande de trace d'annulation cr<63>e une nouvelle trace et acc<63>de <20> la variable correspondante, cette commande de trace sera appel<65>e. Les erreurs dans les traces d'annulation sont ignor<6F>es.<br>
S'il y a plusieurs traces sur une variable elles seront appel<65>es selon leur ordre de cr<63>ation, les plus r<>centes en premier. Si une trace renvoie une erreur, les traces suivantes portant sur la m<>me variable ne seront pas appel<65>es. Si un <20>l<EFBFBD>ment de tableau a une trace positionn<6E>e, et qu'il y a aussi une trace positionn<6E>e sur le tableau dans son ensemble, la trace globale est appel<65>e avant celle qui porte sur l'<27>l<EFBFBD>ment seul.<br>
Une fois cr<63><72>e, la trace reste en effet jusqu'<27> ce qu'elle soit retir<69>e au moyen de la commande <b>trace vdelete</b> d<>crite ci-dessous, ou bien jusqu'<27> ce que la variable soit annul<75>e, ou bien jusqu'<27> ce que l'interpr<70>teur soit d<>truit. L'annulation de l'<27>l<EFBFBD>ment d'un tableau retirera toutes les traces sur cet <20>l<EFBFBD>ment, mais ne retirera pas les traces sur l'ensemble du tableau.<br>
Cette commande retourne une cha<68>ne vide.
</DD>
<DT><br><b>trace vdelete </b><i>name ops command</i></DT><DD>S'il existe une trace positionn<6E>e sur la variable <i>name</i> avec les op<6F>rations <i>ops</i> et la commande <i>command</i>, alors la trace est supprim<69>e, de telle sorte que <i>command</i> ne sera plus jamais appel<65>e. Retourne une cha<68>ne vide.</DD>
<DT><br><b>trace vinfo</b> <i>name</i></DT><DD>
Retourne une liste contenant un <20>l<EFBFBD>ment pour chaque trace positionn<6E>e sur la variable name. Chaque <20>l<EFBFBD>ment de la liste est lui-m<>me une liste contenant deux <20>l<EFBFBD>ments, qui sont les <i>ops</i> et <i>command</i> associ<63>es <20> la trace. Si <i>name</i> n'existe pas ou n'a aucune trace positionn<6E>e, le r<>sultat de la commande sera une cha<68>ne vide.
</DD>
</DL>
</div>
<br>
<br><div ALIGN="CENTER"><A HREF="index.htm"><b>Index</b></A>&nbsp;&nbsp;<A HREF="172.htm"><b>Pr<EFBFBD>c<EFBFBD>dent</b></A>&nbsp;&nbsp;<A HREF="174.htm"><b>Suivant</b></A></div>
</BODY></HTML>