Whole-Script Tracing

DKF: Have you ever wanted to find out just what a Tcl script is doing? Used to how you can use bash's set -x and miss it in Tcl? Then read on!

This wrapper script (which requires Tcl 8.5) works just like a normal tclsh, but prints out each command that is executed during the processing of the script! This it does through the magical power of execution traces, with a just little help from uplevel.


Script

#!/usr/local/bin/tclsh8.5
namespace eval ::tracer {
    variable count 0
    proc callback {command dummy} {
	variable count
	if {[incr count] > 0} {
	    puts TRACE-$count:$command
	}
    }
    proc source args {
	uplevel 2 [list source {*}$args]
    }
    proc tracedSource args {
	variable count -3
	trace add execution ::tracer::source enterstep ::tracer::callback
	catch {source {*}$args} msg opts
	trace remove execution ::tracer::source enterstep ::tracer::callback
	return -options $opts $msg
    }
    proc tracedScript {} {
	global argv argc argv0
	set argv0 [lindex $argv 0]
	set argv [lrange $argv 1 end]
	incr argc -1
	uplevel 1 [list ::tracer::tracedSource $argv0]
    }
}
tracer::tracedScript

Demo

With the demo script (derived from something posted on comp.lang.tcl which in turn inspired me to write the tracing script above) below I get the trace of execution posted below that:

Script being traced

proc story { char story } {
  return [format $story $char ]
}

proc example {} {
  story {Story} "Once upon a time there was a %s
    about a [ story {really contrived example program} {%s of a horrendous sort} ]."
}

puts [example]

Trace of execution

$ ~/Desktop/tracer.tcl ~/Desktop/demo.tcl
TRACE-1:proc story { char story } {
  return [format $story $char ]
}
TRACE-2:proc example {} {
  story {Story} "Once upon a time there was a %s
    about a [ story {really contrived example program} {%s of a horrendous sort} ]."
}
TRACE-3:example
TRACE-4:story {really contrived example program} {%s of a horrendous sort}
TRACE-5:format {%s of a horrendous sort} {really contrived example program}
TRACE-6:return {really contrived example program of a horrendous sort}
TRACE-7:story Story {Once upon a time there was a %s
    about a really contrived example program of a horrendous sort.}
TRACE-8:format {Once upon a time there was a %s
    about a really contrived example program of a horrendous sort.} Story
TRACE-9:return {Once upon a time there was a Story
    about a really contrived example program of a horrendous sort.}
TRACE-10:puts {Once upon a time there was a Story
    about a really contrived example program of a horrendous sort.}
Once upon a time there was a Story
    about a really contrived example program of a horrendous sort.