source [file dirname [info script]]/testing.tcl proc a {n args} { if {$n eq "trace"} { return [basename-stacktrace [stacktrace {*}$args]] } set frame [info frame $n] if {![dict exists $frame proc]} { dict set frame proc {} } basename-stacktrace [list [dict get $frame proc] [file tail [dict get $frame file]] [dict get $frame line] [dict get $frame cmd]] } proc b {args} { a {*}$args } proc c {args} { b {*}$args } # --- Don't change line numbers above test info-frame-1.1 {Current command} -body { c 0 } -result {a infoframe.test 7 {info frame 0}} test info-frame-1.2 {Current Proc} -body { c -1 } -result {b infoframe.test 15 {a -1}} test info-frame-1.3 Caller -body { c -2 } -result {c infoframe.test 19 {b -2}} test info-frame-1.4 {Caller of Caller} -body { c -3 } -result {test infoframe.test 37 {c -3}} test stacktrace-1.1 {Full stack trace} -body { c trace } -result {a infoframe.test 5 stacktrace b infoframe.test 15 {a trace} c infoframe.test 19 {b trace} test infoframe.test 41 {c trace} {} infoframe.test 40 test\ stacktrace-1.1\ \{...} test stacktrace-1.2 {Stack trace with limited depth} -body { # This will limit the stack trace to omit "this" level and below c trace 0 [info frame] } -result {a infoframe.test 5 {stacktrace 0 2} b infoframe.test 15 {a trace 0 2} c infoframe.test 19 {b trace 0 2}} testreport