Version 3 of List the call stack

Updated 2008-03-20 18:20:36 by kpv

The following will list the entire call stack at entry to a proc or method.

    proc x {a} {
       puts "Entered x, args $a"
       set distanceToTop [info level]
       for {set i 1} {$i < $distanceToTop} {incr i} {
          set callerlevel [expr {$distanceToTop - $i}]
          puts "CALLER $callerlevel: [info level $callerlevel]"
      }
    # ...
       return
    }

KPV Here's another version which prints out argument values (even default one).

proc stacktrace {} {
    set stack "Stack trace:\n"
    for {set i 1} {$i < [info level]} {incr i} {
	set lvl [info level -$i]
	set pname [lindex $lvl 0]
	append stack [string repeat " " $i]$pname
	foreach value [lrange $lvl 1 end] arg [info args $pname] {
	    if {$value eq ""} {
                info default $pname $arg value
	    }
	    append stack " $arg='$value'"
	}
	append stack \n
    }
    return $stack
}