projman/hlp/ru/tcl/trace.html
2018-02-05 17:23:37 +03:00

190 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>