trace.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:17k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1993 The Regents of the University of California.
  3. '" Copyright (c) 1994-1996 Sun Microsystems, Inc.
  4. '" Copyright (c) 2000 Ajuba Solutions.
  5. '"
  6. '" See the file "license.terms" for information on usage and redistribution
  7. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  8. '" 
  9. '" RCS: @(#) $Id: trace.n,v 1.13.2.2 2004/10/27 14:43:14 dkf Exp $
  10. '" 
  11. .so man.macros
  12. .TH trace n "8.4" Tcl "Tcl Built-In Commands"
  13. .BS
  14. '" Note:  do not modify the .SH NAME line immediately below!
  15. .SH NAME
  16. trace - Monitor variable accesses, command usages and command executions
  17. .SH SYNOPSIS
  18. fBtrace fIoptionfR ?fIarg arg ...fR?
  19. .BE
  20. .SH DESCRIPTION
  21. .PP
  22. This command causes Tcl commands to be executed whenever certain operations are
  23. invoked.  The legal fIoptionfR's (which may be abbreviated) are:
  24. .TP
  25. fBtrace add fItype name ops ?args?fR
  26. Where fItypefR is fBcommandfR, fBexecutionfR, or fBvariablefR.
  27. .RS
  28. .TP
  29. fBtrace add commandfR fIname ops commandfR
  30. Arrange for fIcommandfR to be executed whenever command fInamefR
  31. is modified in one of the ways given by the list fIopsfR.  fINamefR will be
  32. resolved using the usual namespace resolution rules used by
  33. procedures.  If the command does not exist, an error will be thrown.
  34. .RS
  35. .PP
  36. fIOpsfR indicates which operations are of interest, and is a list of
  37. one or more of the following items:
  38. .TP
  39. fBrenamefR
  40. Invoke fIcommandfR whenever the command is renamed.  Note that
  41. renaming to the empty string is considered deletion, and will not
  42. be traced with 'fBrenamefR'.
  43. .TP
  44. fBdeletefR
  45. Invoke fIcommandfR when the command is deleted.  Commands can be
  46. deleted explicitly by using the fBrenamefR command to rename the
  47. command to an empty string.  Commands are also deleted when the
  48. interpreter is deleted, but traces will not be invoked because there is no
  49. interpreter in which to execute them.
  50. .PP
  51. When the trace triggers, depending on the operations being traced, a 
  52. number of arguments are appended to fIcommandfR so that the actual 
  53. command is as follows:
  54. .CS
  55. fIcommand oldName newName opfR
  56. .CE
  57. fIOldNamefR and fInewNamefR give the traced command's current
  58. (old) name, and the name to which it is being renamed (the empty
  59. string if this is a 'delete' operation).
  60. fIOpfR indicates what operation is being performed on the
  61. command, and is one of fBrenamefR or fBdeletefR as
  62. defined above.  The trace operation cannot be used to stop a command
  63. from being deleted.  Tcl will always remove the command once the trace
  64. is complete.  Recursive renaming or deleting will not cause further traces 
  65. of the same type to be evaluated, so a delete trace which itself
  66. deletes the command, or a rename trace which itself renames the
  67. command will not cause further trace evaluations to occur.
  68. Both fIoldNamefR and fInewNamefR are fully qualified with any namespace(s)
  69. in which they appear.
  70. .RE
  71. .TP
  72. fBtrace add executionfR fIname ops commandfR
  73. Arrange for fIcommandfR to be executed whenever command fInamefR
  74. is executed, with traces occurring at the points indicated by the list
  75. fIopsfR.  fINamefR will be
  76. resolved using the usual namespace resolution rules used by
  77. procedures.  If the command does not exist, an error will be thrown.
  78. .RS
  79. .PP
  80. fIOpsfR indicates which operations are of interest, and is a list of
  81. one or more of the following items:
  82. .TP
  83. fBenterfR
  84. Invoke fIcommandfR whenever the command fInamefR is executed,
  85. just before the actual execution takes place.
  86. .TP
  87. fBleavefR
  88. Invoke fIcommandfR whenever the command fInamefR is executed,
  89. just after the actual execution takes place.
  90. .TP
  91. fBenterstepfR
  92. Invoke fIcommandfR for every Tcl command which is executed 
  93. inside the procedure fInamefR, just before the actual execution
  94. takes place.  For example if we have 'proc foo {} { puts "hello" }',
  95. then an fIenterstepfR trace would be 
  96. invoked just before fIputs "hello"fR is executed.
  97. Setting an fIenterstepfR trace on a fIcommandfR
  98. will not result in an error and is simply ignored.
  99. .TP
  100. fBleavestepfR
  101. Invoke fIcommandfR for every Tcl command which is executed 
  102. inside the procedure fInamefR, just after the actual execution
  103. takes place.
  104. Setting a fIleavestepfR trace on a fIcommandfR
  105. will not result in an error and is simply ignored.
  106. .PP
  107. When the trace triggers, depending on the operations being traced, a 
  108. number of arguments are appended to fIcommandfR so that the actual 
  109. command is as follows:
  110. .PP
  111. For fBenterfR and fBenterstepfR operations:
  112. .CS
  113. fIcommand command-string opfR
  114. .CE
  115. fICommand-stringfR gives the complete current command being 
  116. executed (the traced command for a fBenterfR operation, an 
  117. arbitrary command for a fBenterstepfR operation), including
  118. all arguments in their fully expanded form.
  119. fIOpfR indicates what operation is being performed on the
  120. command execution, and is one of fBenterfR or fBenterstepfR as
  121. defined above.  The trace operation can be used to stop the
  122. command from executing, by deleting the command in question.  Of
  123. course when the command is subsequently executed, an 'invalid command'
  124. error will occur.
  125. .PP
  126. For fBleavefR and fBleavestepfR operations:
  127. .CS
  128. fIcommand command-string code result opfR
  129. .CE
  130. fICommand-stringfR gives the complete current command being 
  131. executed (the traced command for a fBenterfR operation, an 
  132. arbitrary command for a fBenterstepfR operation), including
  133. all arguments in their fully expanded form.
  134. fICodefR gives the result code of that execution, and fIresultfR
  135. the result string.
  136. fIOpfR indicates what operation is being performed on the
  137. command execution, and is one of fBleavefR or fBleavestepfR as
  138. defined above.  
  139. Note that the creation of many fBenterstepfR or
  140. fBleavestepfR traces can lead to unintuitive results, since the
  141. invoked commands from one trace can themselves lead to further
  142. command invocations for other traces.
  143. .PP
  144. fICommandfR executes in the same context as the code that invoked
  145. the traced operation: thus the fIcommandfR, if invoked from a procedure,
  146. will have access to the same local variables as code in the procedure.
  147. This context may be different than the context in which the trace was
  148. created. If fIcommandfR invokes a procedure (which it normally does)
  149. then the procedure will have to use upvar or uplevel commands if it wishes
  150. to access the local variables of the code which invoked the trace operation.
  151. .PP
  152. While fIcommandfR is executing during an execution trace, traces
  153. on fInamefR are temporarily disabled. This allows the fIcommandfR
  154. to execute fInamefR in its body without invoking any other traces again.
  155. If an error occurs while executing the fIcommandfR body, then the
  156. command fInamefR as a whole will return that same error.
  157. .PP
  158. When multiple traces are set on fInamefR, then for fIenterfR
  159. and fIenterstepfR operations, the traced commands are invoked
  160. in the reverse order of how the traces were originally created;
  161. and for fIleavefR and fIleavestepfR operations, the traced
  162. commands are invoked in the original order of creation.
  163. .PP
  164. The behavior of execution traces is currently undefined for a command 
  165. fInamefR imported into another namespace.
  166. .RE
  167. .TP
  168. fBtrace add variablefI name ops commandfR
  169. Arrange for fIcommandfR to be executed whenever variable fInamefR
  170. is accessed in one of the ways given by the list fIopsfR.  fINamefR may
  171. refer to a normal variable, an element of an array, or to an array
  172. as a whole (i.e. fInamefR may be just the name of an array, with no
  173. parenthesized index).  If fInamefR refers to a whole array, then
  174. fIcommandfR is invoked whenever any element of the array is
  175. manipulated.  If the variable does not exist, it will be created but
  176. will not be given a value, so it will be visible to fBnamespace whichfR
  177. queries, but not to fBinfo existsfR queries.
  178. .RS
  179. .PP
  180. fIOpsfR indicates which operations are of interest, and is a list of
  181. one or more of the following items:
  182. .TP
  183. fBarrayfR
  184. Invoke fIcommandfR whenever the variable is accessed or modified via
  185. the fBarrayfR command, provided that fInamefR is not a scalar
  186. variable at the time that the fBarrayfR command is invoked.  If
  187. fInamefR is a scalar variable, the access via the fBarrayfR
  188. command will not trigger the trace.
  189. .TP
  190. fBreadfR
  191. Invoke fIcommandfR whenever the variable is read.
  192. .TP
  193. fBwritefR
  194. Invoke fIcommandfR whenever the variable is written.
  195. .TP
  196. fBunsetfR
  197. Invoke fIcommandfR whenever the variable is unset.  Variables
  198. can be unset explicitly with the fBunsetfR command, or
  199. implicitly when procedures return (all of their local variables
  200. are unset).  Variables are also unset when interpreters are
  201. deleted, but traces will not be invoked because there is no
  202. interpreter in which to execute them.
  203. .PP
  204. When the trace triggers, three arguments are appended to
  205. fIcommandfR so that the actual command is as follows:
  206. .CS
  207. fIcommand name1 name2 opfR
  208. .CE
  209. fIName1fR and fIname2fR give the name(s) for the variable
  210. being accessed:  if the variable is a scalar then fIname1fR
  211. gives the variable's name and fIname2fR is an empty string;
  212. if the variable is an array element then fIname1fR gives the
  213. name of the array and name2 gives the index into the array;
  214. if an entire array is being deleted and the trace was registered
  215. on the overall array, rather than a single element, then fIname1fR
  216. gives the array name and fIname2fR is an empty string.
  217. fIName1fR and fIname2fR are not necessarily the same as the
  218. name used in the fBtrace variablefR command:  the fBupvarfR
  219. command allows a procedure to reference a variable under a
  220. different name.
  221. fIOpfR indicates what operation is being performed on the
  222. variable, and is one of fBreadfR, fBwritefR, or fBunsetfR as
  223. defined above.
  224. .PP
  225. fICommandfR executes in the same context as the code that invoked
  226. the traced operation:  if the variable was accessed as part of a Tcl
  227. procedure, then fIcommandfR will have access to the same local
  228. variables as code in the procedure.  This context may be different
  229. than the context in which the trace was created. If fIcommandfR
  230. invokes a procedure (which it normally does) then the procedure will
  231. have to use fBupvarfR or fBuplevelfR if it wishes to access the
  232. traced variable.  Note also that fIname1fR may not necessarily be
  233. the same as the name used to set the trace on the variable;
  234. differences can occur if the access is made through a variable defined
  235. with the fBupvarfR command.
  236. .PP
  237. For read and write traces, fIcommandfR can modify the variable to
  238. affect the result of the traced operation.  If fIcommandfR modifies
  239. the value of a variable during a read or write trace, then the new
  240. value will be returned as the result of the traced operation.  The
  241. return value from  fIcommandfR is ignored except that if it returns
  242. an error of any sort then the traced operation also returns an error
  243. with the same error message returned by the trace command (this
  244. mechanism can be used to implement read-only variables, for example).
  245. For write traces, fIcommandfR is invoked after the variable's value
  246. has been changed; it can write a new value into the variable to
  247. override the original value specified in the write operation.  To
  248. implement read-only variables, fIcommandfR will have to restore the
  249. old value of the variable.
  250. .PP
  251. While fIcommandfR is executing during a read or write trace, traces
  252. on the variable are temporarily disabled.  This means that reads and
  253. writes invoked by fIcommandfR will occur directly, without invoking
  254. fIcommandfR (or any other traces) again.  However, if fIcommandfR
  255. unsets the variable then unset traces will be invoked.
  256. .PP
  257. When an unset trace is invoked, the variable has already been deleted:
  258. it will appear to be undefined with no traces.  If an unset occurs
  259. because of a procedure return, then the trace will be invoked in the
  260. variable context of the procedure being returned to:  the stack frame
  261. of the returning procedure will no longer exist.  Traces are not
  262. disabled during unset traces, so if an unset trace command creates a
  263. new trace and accesses the variable, the trace will be invoked.  Any
  264. errors in unset traces are ignored.
  265. .PP
  266. If there are multiple traces on a variable they are invoked in order
  267. of creation, most-recent first.  If one trace returns an error, then
  268. no further traces are invoked for the variable.  If an array element
  269. has a trace set, and there is also a trace set on the array as a
  270. whole, the trace on the overall array is invoked before the one on the
  271. element.
  272. .PP
  273. Once created, the trace remains in effect either until the trace is
  274. removed with the fBtrace remove variablefR command described below,
  275. until the variable is unset, or until the interpreter is deleted.
  276. Unsetting an element of array will remove any traces on that element,
  277. but will not remove traces on the overall array.
  278. .PP
  279. This command returns an empty string.
  280. .RE
  281. .RE
  282. .TP
  283. fBtrace remove fItype name opList commandfR
  284. Where fItypefR is either fBcommandfR, fBexecutionfR or fBvariablefR.
  285. .RS
  286. .TP
  287. fBtrace remove commandfI name opList commandfR
  288. If there is a trace set on command fInamefR with the operations and
  289. command given by fIopListfR and fIcommandfR, then the trace is
  290. removed, so that fIcommandfR will never again be invoked.  Returns
  291. an empty string.   If fInamefR doesn't exist, the command will throw
  292. an error.
  293. .TP
  294. fBtrace remove executionfI name opList commandfR
  295. If there is a trace set on command fInamefR with the operations and
  296. command given by fIopListfR and fIcommandfR, then the trace is
  297. removed, so that fIcommandfR will never again be invoked.  Returns
  298. an empty string.   If fInamefR doesn't exist, the command will throw
  299. an error.
  300. .TP
  301. fBtrace remove variablefI name opList commandfR
  302. If there is a trace set on variable fInamefR with the operations and
  303. command given by fIopListfR and fIcommandfR, then the trace is
  304. removed, so that fIcommandfR will never again be invoked.  Returns
  305. an empty string.
  306. .RE
  307. .TP
  308. fBtrace info fItype namefR
  309. Where fItypefR is either fBcommandfR, fBexecutionfR or fBvariablefR.
  310. .RS
  311. .TP
  312. fBtrace info commandfI namefR
  313. Returns a list containing one element for each trace currently set on
  314. command fInamefR. Each element of the list is itself a list
  315. containing two elements, which are the fIopListfR and fIcommandfR
  316. associated with the trace.  If fInamefR doesn't have any traces set,
  317. then the result of the command will be an empty string.  If fInamefR
  318. doesn't exist, the command will throw an error.
  319. .TP
  320. fBtrace info executionfI namefR
  321. Returns a list containing one element for each trace currently set on
  322. command fInamefR. Each element of the list is itself a list
  323. containing two elements, which are the fIopListfR and fIcommandfR
  324. associated with the trace.  If fInamefR doesn't have any traces set,
  325. then the result of the command will be an empty string.  If fInamefR
  326. doesn't exist, the command will throw an error.
  327. .TP
  328. fBtrace info variablefI namefR
  329. Returns a list containing one element for each trace currently set on
  330. variable fInamefR.  Each element of the list is itself a list
  331. containing two elements, which are the fIopListfR and fIcommandfR
  332. associated with the trace.  If fInamefR doesn't exist or doesn't
  333. have any traces set, then the result of the command will be an empty
  334. string.
  335. .RE
  336. .PP
  337. For backwards compatibility, three other subcommands are available:
  338. .RS
  339. .TP
  340. fBtrace variable fIname ops commandfR
  341. This is equivalent to fBtrace add variable fIname ops commandfR.
  342. .TP
  343. fBtrace vdelete fIname ops commandfR
  344. This is equivalent to fBtrace remove variable fIname ops commandfR
  345. .TP 
  346. fBtrace vinfo fInamefR 
  347. This is equivalent to fBtrace info variable fInamefR
  348. .RE
  349. .PP
  350. These subcommands are deprecated and will likely be removed in a
  351. future version of Tcl.  They use an older syntax in which fBarrayfR,
  352. fBreadfR, fBwritefR, fBunsetfR are replaced by fBafR, fBrfR,
  353. fBwfR and fBufR respectively, and the fIopsfR argument is not a
  354. list, but simply a string concatenation of the operations, such as
  355. fBrwuafR.
  356. .SH EXAMPLES
  357. Print a message whenever either of the global variables fBfoofR and
  358. fBbarfR are updated, even if they have a different local name at the
  359. time (which can be done with the fBupvarfR command):
  360. .CS
  361. proc tracer {varname args} {
  362.     upvar #0 $varname var
  363.     puts "$varname was updated to be e"$vare""
  364. }
  365. fBtrace addfR variable foo write "tracer foo"
  366. fBtrace addfR variable bar write "tracer bar"
  367. .CE
  368. .PP
  369. Ensure that the global variable fBfoobarfR always contains the
  370. product of the global variables fBfoofR and fBbarfR:
  371. .CS
  372. proc doMult args {
  373.     global foo bar foobar
  374.     set foobar [expr {$foo * $bar}]
  375. }
  376. fBtrace addfR variable foo write doMult
  377. fBtrace addfR variable bar write doMult
  378. .CE
  379. .SH "SEE ALSO"
  380. set(n), unset(n)
  381. .SH KEYWORDS
  382. read, command, rename, variable, write, trace, unset