|
Description:
Of course, Tcl's most minimal debugger is puts. But here is a cute
little piece of code that offers some more debugging functionality (if
you have stdin and stdout available - so not for wish on Windows)
Source: Text Source
proc bp {{s {}}} {
if {![info exists ::bp_skip]} {
set ::bp_skip [list]
} elseif {[lsearch -exact $::bp_skip $s]>=0} {
return
}
set who [info level -1]
while 1 {
puts -nonewline "$who/$s> "; flush stdout
gets stdin line
if {$line=="c"} {puts "continuing.."; break}
if {$line=="i"} {set line "info locals"}
catch {uplevel 1 $line} res
puts $res
}
}
The license for this recipe is available here.
Discussion:
The idea is that you insert breakpoints, calls to bp, in critical
code with an optional string argument (that may be used for
distinguishing), like this:
proc foo {args} {
set x 1
bp 1
string toupper $args
}
foo bar and grill
When execution reaches bp, you get a prompt on stdout, giving the
calling context and the bp string, like this:
foo bar and grill/1> pwd
/home/suchenwi/src/roi/test/mr
foo bar and grill/1> i
args x
foo bar and grill/1> set args
bar and grill
foo bar and grill/1> set args lowercase
lowercase
foo bar and grill/1> c
on which you can issue any Tcl command (especially getting or
setting variable values in the scope of foo), shorthand commands ("i"
for "info locals"; add which others you need), and exit this
micro-debugger with "c"(ontinue). Because you modified a local
variable, foo's result will be
LOWERCASE
To turn off all breakpoints for an application, just say (maybe
from inside bp):
proc bp args {}
You can disable single breakpoints labeled e.g. x with the command
lappend ::bp_skip x
Stepping would be a bigger project, but in some situations a
micro-debugger like this is good enough. See also (http://www.purl.org/thecliff/tcl/wiki/473.html) What debugging
tools are available to a Tcl programmer on the Wiki.
|