<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>trace</title> </head> <body> <h1>trace</h1> <p>Команда отслеживает работу с переменными.</p> <h2>СИНТАКСИС</h2> <pre> <strong>trace</strong> <em>option</em> ?<em>arg</em> <em>arg</em>...? </pre> <h2>ОПИСАНИЕ</h2> <p>Эта команда вызывает выполнение указанных Tcl команда при определенных действиях с переменной. Ниже перечислены возможные опции команды (допускаются сокращения).</p> <dl> <dt><strong>trace</strong> <em>variable</em> <em>name</em> <em>ops</em> <em>command</em></dt> <dd><p>Обеспечивает выполнение команды <em>command</em> при определенных действиях с переменной <em>name</em>. Ниже перечислены возможные значения аргумента <em>ops</em> и какие действия с переменной при этом отслеживаются. Аргумент <em>name</em> может содержать имя простой переменной, имя элемента массива или имя массива. Если <em>name</em> содержит имя массива, то команда <em>command</em> выполняется при соответствующих действиях с любым элементом массива.</p> <p>Аргумент <em>ops</em> состоит из одной или больше букв, перечисленных ниже.</p> <table> <tr> <td><strong>r</strong></td> <td>Вызывает команду command при чтении переменной.</td> </tr> <tr> <td><strong>w</strong></td> <td>Вызывает команду command при присвоении значения переменной.</td> </tr> <tr> <td><strong>u</strong></td> <td>Вызывает команду <em>command</em> при удалении переменной. Переменная может удаляться как явно (с помощью команды <strong><a href="unset.html">unset</a></strong>), так и неявно (при завершении процедуры). переменная также удаляется при удалении интерпретатора, в котором она была создана. Однако, при этом соответствующая команда не вызывается, так как уже нет интерпретатора, в котором ее можно было бы выполнить. </td> </tr> </table> <p>Когда срабатывает команда <strong>trace</strong>, то исполняемая команда <em>command</em> дополняется тремя аргументами, как указано ниже</p> <pre> <strong>command</strong> <em>name1</em> <em>name2</em> <em>op</em><br> </pre> <p>Здесь <em>name1</em> это имя переменной, действия с которой вызвали срабатывание команды. Если это элемент массива, то <em>name1</em> это имя массива, а <em>name2</em> - имя конкретного элемента массива. В противном случае <em>name2</em> - пустая строка. Если в команде <em>trace</em> было указано имя массива и он удаляется, то <em>name2</em> также будет пустой строкой. Имена в переменных <em>name1</em> и <em>name2</em> не обязано совпадать с теми, что были заданы в команде <strong>trace variable</strong>, поскольку команда <a href="upvar.html"><strong>upvar</strong></a> позволяет процедуре обращаться к переменной по различным именам. Аргумент <em>op</em> указывает какое именно действие выполнялось с переменной и может принимать значения <strong>r</strong>, <strong>w</strong> или <strong>u</strong> как указано выше. </p> <p>Команда <em>command</em> исполняется в том же контексте, что и код, вызвавший срабатывание <strong>trace</strong>. То есть если действие с переменной выполнялось в процедуре, то команда <em>command</em> может обращаться к локальным переменным этой процедуры. Этот контекст может отличаться от контекста, в котором выполнялась сама команда <strong>trace</strong>. Если команда <em>conmmand</em> есть вызов процедуры (как обычно и бывает), то в процедуре необходимо использовать команду <a href= "upvar.html"><strong>upvar</strong></a> или <a href= "uplevel.html"><strong>uplevel</strong></a> чтобы получить доступ к контролируемой переменной. Как уже говорилось, имена в переменных <em>name1</em> и <em>name2</em>не обязано совпадать с теми, что были заданы в команде <strong>trace variable</a></strong>, поскольку команда <a href="upvar.html"><strong>upvar</strong></a> позволяет процедуре обращаться к переменной по различным именам.</p> <p>Если команда <strong>trace</strong> контролирует чтение и запись в переменную, команда <em>command</em> может изменить результат отслеживаемой операции. Если команда <em>command</em> изменяет значение отслеживаемой переменной, то новое значение будет возвращено как результат отслеживаемой операции. Величина, возвращаемая командой <em>command</em>, игнорируется, если только это не ошибка. Тогда отслеживаемая операция также возвращает ошибку с тем же самым сообщением об ошибке, которое было сформировано в команде <em>command</em>, не поясняя, что ошибка произошла в результате отслеживания переменной. Это может приводить к определенным трудностям в определении истиной операции, при выполнении которой возникла ошибка.</p> <p>При отслеживании записи в переменную команда <em>command</em> вызывается после того, как значение переменной изменено. Поэтому с ее помощью можно изменить присвоенное значение. Если при этом возвращать исходное значение, переменная окажется доступной только для чтения.</p> <p>При выполнении команды <em>command</em> при отслеживании чтения или записи в переменную механизм слежения временно отключается. То есть выполнение этих операций в <em>command</em> не приведет к новых вызовам <em>command</em>. Однако, если в <em>command</em> выполняется удаление переменной, это приводит к соответствующему вызову.</p> <p>Когда срабатывает команда trace на удаление переменной, переменная уже удалена. Если удаление переменной произошло вследствие завершения процедуры, команда <em>command</em> вызывается в контексте вызывающей процедуры, поскольку контекст вызвавшейся процедуры уже не существует. Отслеживание не отключается при выполнении <em>command</em> в случае удаления переменной. Поэтому если в <em>command</em> выполняется новая команда <strong>trace</strong> и удаляется соответствующая переменная, выполнится и соответствующая команда command. Ошибки при отслеживании удаления игнорируются.</p> <p>Если одна и та же переменная отслеживается с помощью нескольких команда <strong>trace</strong>, то выполняться все соответствующие команды <em>command</em> с учетом порядка выполнения соответствующих команд <strong>trace</strong>. Чем позднее она выполнялась, тем раньше будет выполнена соответствующая команда<em> command</em>. Если одна из команд <em>command</em> при этом возвратит ошибку, остальные команды выполняться не будут. Если одна команда используется для отслеживания элемента массива, а другая - для массива в целом, первой выполняется команда отслеживания массива в целом, а затем уже команда отслеживания элемента.</p> <p>Однажды выполненная команда <strong>trace</strong> остается активной пока она не удалена с помощью описанной ниже команды <strong>trace</strong> <em>vdelete</em>, пока не удалена переменная или пока не удален интерпретатор. Удаление элемента массива приведет к прекращению отслеживания этого элемента, но не отслеживания массива в целом.</p> <p>Команда <strong>trace variable</strong> возвращает пустую строку.</p> </dd> <dt><strong>trace</strong> <em>vdelete</em> <em>name</em> <em>ops</em> <em>command</em></dt> <dd><p>Если задано отслеживание переменной <em>name</em> с перечнем действий <em>ops</em> и командой <em>command</em>, то оно будет удалено. Соответственно команда <em>command</em> никогда не будет вызвана. Команда <strong>trace vdelete</strong> возвращает пустую строку.</p> </dd> <dt><strong>trace</strong> <em>vinfo</em> <em>name</em></dt> <dd><p>Возвращает список, содержащий по одному элементу для каждого заданного отслеживания для переменной name. Каждый элемент списка содержит два элемента, содержащие значения <em>ops</em> и <em>command</em> из команды <strong>trace</strong>, которой было задано соответствующее отслеживание. Если переменная name не существует или для нее не задано отслеживания, команда возвращает пустую строку.</p> </dd> </dl> </body> </html>