projman/hlp/ru/tcl/trace.html

190 lines
12 KiB
HTML
Raw Normal View History

<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
2015-10-19 13:27:31 +03:00
<html>
<head>
<title>trace</title>
</head>
<body>
<h1>trace</h1>
<p>Команда отслеживает работу с переменными.</p>
2015-10-19 13:27:31 +03:00
<h2>СИНТАКСИС</h2>
2015-10-19 13:27:31 +03:00
<pre>
<strong>trace</strong> <em>option</em> ?<em>arg</em> <em>arg</em>...?
</pre>
<h2>ОПИСАНИЕ</h2>
2015-10-19 13:27:31 +03:00
<p>Эта команда вызывает выполнение указанных Tcl команда при
определенных действиях с переменной. Ниже перечислены возможные
опции команды (допускаются сокращения).</p>
2015-10-19 13:27:31 +03:00
<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>
2015-10-19 13:27:31 +03:00
<table>
<tr>
<td><strong>r</strong></td>
<td>Вызывает команду command при чтении переменной.</td>
2015-10-19 13:27:31 +03:00
</tr>
<tr>
<td><strong>w</strong></td>
<td>Вызывает команду command при присвоении значения
переменной.</td>
2015-10-19 13:27:31 +03:00
</tr>
<tr>
<td><strong>u</strong></td>
<td>Вызывает команду <em>command</em> при удалении
переменной. Переменная может удаляться как явно (с
помощью команды <strong><a
href=unset.html>unset</a></strong>), так и неявно (при
завершении процедуры). переменная также удаляется
при удалении интерпретатора, в котором она была
создана. Однако, при этом соответствующая команда
не вызывается, так как уже нет интерпретатора, в
котором ее можно было бы выполнить.
2015-10-19 13:27:31 +03:00
</td>
</tr>
</table>
<p>Когда срабатывает команда <strong>trace</strong>, то исполняемая
команда <em>command</em> дополняется тремя аргументами, как
указано ниже</p>
2015-10-19 13:27:31 +03:00
<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> как указано выше.
2015-10-19 13:27:31 +03:00
</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>
2015-10-19 13:27:31 +03:00
</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>
2015-10-19 13:27:31 +03:00
</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>
2015-10-19 13:27:31 +03:00
</dd>
</dl>
</body>
</html>