190 lines
12 KiB
HTML
190 lines
12 KiB
HTML
<!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>
|
||
|