Phil Ehrens - UNIX only. This page was originally part of the Bag of algorithms.
proc leakLogger { } { foreach { name pid pcpu pmem vsz rss } [ sysData ] { break } if { ! [ info exists ::memusage_t0 ] } { set ::memusage_t0 [ clock seconds ] lappend ::memusage_t0 $vsz puts "inital size of $::argv0: $vsz Kb" } foreach { t0 x0 } $::memusage_t0 { break } set tn [ clock seconds ] set xn $vsz set t [ expr { $tn - $t0 } ] set leak [ expr { $xn - $x0 } ] if { $leak } { puts "LEAKED $leak Kb in $t seconds" } return {} } if {$tcl_platform(os) eq "SunOS" && $tcl_platform(osVersion) >= 5} { proc sysData {} { set data [exec /bin/ps -p [pid] -o "fname pid pcpu pmem vsz rss"] foreach datum [lrange [split $data "\n"] 1 end] { return $datum } puts stderr "Something's rotten in the state of Denmark..." } } else { proc sysData { } { set done 0 set myname [ file tail $::argv0 ] set data [ exec ps -Ao "fname pid pcpu pmem vsz rss" ] set data [ lrange [ split $data "\n" ] 1 end ] foreach datum $data { foreach { name pid pcpu pmem vsz rss } $datum { if { [ regexp ^$name $myname ] || [ regexp ^$myname $name ] } { set done 1 break } } if { $done } { break } } if { $done } { return $datum } else { puts stderr "dagnabbit, you're using that lame \"exec tclsh \"\$0\" \${1+\"\$@\"}\" thing, so this won't work!!" } } ;## -PSE }