2018-02-05 17:22:04 +03:00
|
|
|
|
<!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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда отслеживает работу с переменными.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ОПИСАНИЕ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td>Вызывает команду command при чтении переменной.</td>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><strong>w</strong></td>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td>Вызывает команду command при присвоении значения
|
|
|
|
|
переменной.</td>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><strong>u</strong></td>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td>Вызывает команду <em>command</em> при удалении
|
|
|
|
|
переменной. Переменная может удаляться как явно (с
|
|
|
|
|
помощью команды <strong><a
|
|
|
|
|
href=unset.html>unset</a></strong>), так и неявно (при
|
|
|
|
|
завершении процедуры). переменная также удаляется
|
|
|
|
|
при удалении интерпретатора, в котором она была
|
|
|
|
|
создана. Однако, при этом соответствующая команда
|
|
|
|
|
не вызывается, так как уже нет интерпретатора, в
|
|
|
|
|
котором ее можно было бы выполнить.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|