Tcl_CreateTrace, Tcl_CreateObjTrace, Tcl_DeleteTrace − arrange for command execution to be traced


#include <tcl.h>

(interp, level, proc, clientData)

(interp, level, flags, objProc, clientData, deleteProc)

Tcl_DeleteTrace(interp, trace)


Tcl_Interp *interp (in)

Interpreter containing command to be traced or untraced.

int level (in)

Only commands at or below this nesting level will be traced unless 0 is specified. 1 means top-level commands only, 2 means top-level commands or those that are invoked as immediate consequences of executing top-level commands (procedure bodies, bracketed commands, etc.) and so on. A value of 0 means that commands at any level are traced.

int flags (in)

Flags governing the trace execution. See below for details.

Tcl_CmdObjTraceProc *objProc (in)

Procedure to call for each command that is executed. See below for details of the calling sequence.

Tcl_CmdTraceProc *proc (in)

Procedure to call for each command that is executed. See below for details on the calling sequence.

ClientData clientData (in)

Arbitrary one-word value to pass to objProc or proc.

Tcl_CmdObjTraceDeleteProc *deleteProc (in)

Procedure to call when the trace is deleted. See below for details of the calling sequence. A NULL pointer is permissible and results in no callback when the trace is deleted.

Tcl_Trace trace (in)

Token for trace to be removed (return value from previous call to Tcl_CreateTrace).



Tcl_CreateObjTrace arranges for command tracing. After it is called, objProc will be invoked before the Tcl interpreter calls any command procedure when evaluating commands in interp. The return value from Tcl_CreateObjTrace is a token for the trace, which may be passed to Tcl_DeleteTrace to remove the trace. There may be many traces in effect simultaneously for the same interpreter.

objProc should have arguments and result that match the type, Tcl_CmdObjTraceProc:

typedef int Tcl_CmdObjTraceProc(
* interp,
int level,
const char *command,
int objc,
*const objv[] );

The clientData and interp parameters are copies of the corresponding arguments given to Tcl_CreateTrace. ClientData typically points to an application-specific data structure that describes what to do when objProc is invoked. The level parameter gives the nesting level of the command (1 for top-level commands passed to Tcl_Eval by the application, 2 for the next-level commands passed to Tcl_Eval as part of parsing or interpreting level-1 commands, and so on). The command parameter points to a string containing the text of the command, before any argument substitution. The commandToken parameter is a Tcl command token that identifies the command to be invoked. The token may be passed to Tcl_GetCommandName, Tcl_GetCommandInfoFromToken, or Tcl_SetCommandInfoFromToken to manipulate the definition of the command. The objc and objv parameters designate the final parameter count and parameter vector that will be passed to the command, and have had all substitutions performed.

The objProc callback is expected to return a standard Tcl status return code. If this code is TCL_OK (the normal case), then the Tcl interpreter will invoke the command. Any other return code is treated as if the command returned that status, and the command is not invoked.

The objProc callback must not modify objv in any way. It is, however, permissible to change the command by calling Tcl_SetCommandTokenInfo prior to returning. Any such change takes effect immediately, and the command is invoked with the new information.

Tracing will only occur for commands at nesting level less than or equal to the level parameter (i.e. the level parameter to objProc will always be less than or equal to the level parameter to Tcl_CreateTrace).

Tracing has a significant effect on runtime performance because it causes the bytecode compiler to refrain from generating in-line code for Tcl commands such as if and while in order that they may be traced. If traces for the built-in commands are not required, the flags parameter may be set to the constant value TCL_ALLOW_INLINE_COMPILATION. In this case, traces on built-in commands may or may not result in trace callbacks, depending on the state of the interpreter, but run-time performance will be improved significantly. (This functionality is desirable, for example, when using Tcl_CreateObjTrace to implement an execution time profiler.)

Calls to objProc will be made by the Tcl parser immediately before it calls the command procedure for the command (cmdProc). This occurs after argument parsing and substitution, so tracing for substituted commands occurs before tracing of the commands containing the substitutions. If there is a syntax error in a command, or if there is no command procedure associated with a command name, then no tracing will occur for that command. If a string passed to Tcl_Eval contains multiple commands (bracketed, or on different lines) then multiple calls to objProc will occur, one for each command.

Tcl_DeleteTrace removes a trace, so that no future calls will be made to the procedure associated with the trace. After Tcl_DeleteTrace returns, the caller should never again use the trace token.

When Tcl_DeleteTrace is called, the interpreter invokes the deleteProc that was passed as a parameter to Tcl_CreateObjTrace. The deleteProc must match the type, Tcl_CmdObjTraceDeleteProc:

typedef void Tcl_CmdObjTraceDeleteProc(

The clientData parameter will be the same as the clientData parameter that was originally passed to Tcl_CreateObjTrace.

Tcl_CreateTrace is an alternative interface for command tracing, not recommended for new applications. It is provided for backward compatibility with code that was developed for older versions of the Tcl interpreter. It is similar to Tcl_CreateObjTrace, except that its proc parameter should have arguments and result that match the type Tcl_CmdTraceProc:

typedef void Tcl_CmdTraceProc(
ClientData clientData,
Tcl_Interp *interp,
int level,
char *command,
Tcl_CmdProc *cmdProc,
ClientData cmdClientData,
int argc,
const char *argv[]);

The parameters to the proc callback are similar to those of the objProc callback above. The commandToken is replaced with cmdProc, a pointer to the (string-based) command procedure that will be invoked; and cmdClientData, the client data that will be passed to the procedure. The objc parameter is replaced with an argv parameter, that gives the arguments to the command as character strings. Proc must not modify the command or argv strings.

If a trace created with Tcl_CreateTrace is in effect, inline compilation of Tcl commands such as if and while is always disabled. There is no notification when a trace created with Tcl_CreateTrace is deleted. There is no way to be notified when the trace created by Tcl_CreateTrace is deleted. There is no way for the proc associated with a call to Tcl_CreateTrace to abort execution of command.


command, create, delete, interpreter, trace

More Linux Commands

obex-data-server(1) - D-Bus service providing OBEX functiona
obex-data-server is D-Bus service providing high-level OBEX client and server side functionality. It currently supports OPP (Object Push Profile), FTP (File Tra

XSetLineAttributes(3) - GC convenience routines (Man Page)
The XSetLineAttributes function sets the line drawing components in the specified GC. XSetLineAttributes can generate BadAlloc, BadGC, and BadValue errors. The

pthread_attr_setstackaddr(3) - set/get stack address attribu
These functions are obsolete: do not use them. Use pthread_attr_setstack(3) and pthread_attr_getstack(3) instead. The pthread_attr_setstackaddr() function sets

XGetWMNormalHints(3) - allocate size hints structure and set
The XAllocSizeHints function allocates and returns a pointer to a XSizeHints structure. Note that all fields in the XSizeHints structure are initially set to ze

getrlimit(2) - get/set resource limits - Linux manual page
The getrlimit() and setrlimit() system calls get and set resource limits respectively. Each resource has an associated soft and hard limit, as defined by the rl

XtIsShell(3) - obtain and verify a widget's class (ManPage)
The XtClass function returns a pointer to the widgets class structure. The XtSuperclass function returns a pointer to the widgets superclass class structure. Th

anvil(8) - Postfix session count and request rate control...
The Postfix anvil(8) server maintains statistics about client connection counts or client request rates. This information can be used to defend against clients

symlink(2) - make a new name for a file - Linux manual page
symlink() creates a symbolic link named linkpath which contains the string target. Symbolic links are interpreted at run time as if the contents of the link had

prtstat(1) - print statistics of a process - Linux man page
prtstat prints the statistics of the specified process. This information comes from the /proc/PID/stat file. OPTIONS -r,--raw Print the information in raw forma

dbopen(3) - database access methods - Linux manual page.....
Note well: This page documents interfaces provided in glibc up until version 2.1. Since version 2.2, glibc no longer provides these interfaces. Probably, you ar

Tcl_ConditionWait(3) - Tcl thread support - Linux man page
Tcl provides Tcl_CreateThread for creating threads. The caller can determine the size of the stack given to the new thread and modify the behaviour through the

systemd.device(5) - systemd device configuration files......
A unit configuration file whose name ends in .device encodes information about a device unit as exposed in the sysfs/udev(7) device tree. This unit type has no

We can't live, work or learn in freedom unless the software we use is free.