| Deutsch English Français Italiano |
|
<vcde4n$3tbui$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: et99 <et99@rocketship1.me>
Newsgroups: comp.lang.tcl
Subject: Re: Show argument values in bgerror
Date: Tue, 17 Sep 2024 19:32:55 -0700
Organization: A noiseless patient Spider
Lines: 65
Message-ID: <vcde4n$3tbui$1@dont-email.me>
References: <b42edc7a9bab2a468f2694eda7a2df32@www.novabbs.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Wed, 18 Sep 2024 04:32:55 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="d2b8cdfd620b59c4d9bd094d3220daf9";
logging-data="4108242"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19qnkLJMtGJnYAhsRdAGBYY"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:IE9eCmUb+wa83xh7npRnwfd4fsM=
In-Reply-To: <b42edc7a9bab2a468f2694eda7a2df32@www.novabbs.com>
Content-Language: en-US
Bytes: 2972
On 9/17/2024 2:31 PM, alexandru wrote:
> I have this ::bgerror function to help debug errors in program flow:
>
> proc ::bgerror {message} {
> global errorInfo
> puts "*** START OF ERROR MESSAGE ***\n$message\n$errorInfo\n*** END OF
> ERROR MESSAGE ***"
> }
>
> The issue is, that the errorInfo does not show the values of the
> arguments of called procedures in the stack.
> Thus it's often not clear which arguments lead the the error.
> Is there a trick how to show the values with which the procedures were
> called in the stack prior to the error?
>
> Many thanks
> Alexandru
Here's some test code I cobbled together, I think there may be something here that does what you want. The "info level [info level]" might be just what you need, if issued at the proper uplevel. Note, the outer info has 2 args, the inner info only 1 and that's intentional. You likely would iterate on uplevel's and toss ones that give an error.
console show
proc foo {} {foo2 11 22 33}
proc foo2 {a b c} {set x 1; set y 2; foo3}
proc foo3 {} {
set level [info frame]
puts "level= |$level| "
set vars [ \
uplevel 1 {
set _vars [info vars]
puts "_vars= |$_vars| level= [info frame] args= [info level [info level]]"
foreach _var $_vars {
puts " _var= |$_var| "
lappend _varsx "$_var = [set $_var]"
}
set _varsx
}
]
puts "vars= |$vars| "
puts [join $vars \n]
}
if [catch {
foo
} err_code] {
puts $err_code
}
output:
level= |9|
_vars= |a b c x y| level= 10 args= foo2 11 22 33
_var= |a|
_var= |b|
_var= |c|
_var= |x|
_var= |y|
vars= |{a = 11} {b = 22} {c = 33} {x = 1} {y = 2}|
a = 11
b = 22
c = 33
x = 1
y = 2