[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How to display parameters in a function backtrace?
From: |
Alex fxmbsw7 Ratchev |
Subject: |
Re: How to display parameters in a function backtrace? |
Date: |
Wed, 2 Feb 2022 15:47:39 +0100 |
the attached text is how it looks like since newly
On Wed, Feb 2, 2022 at 3:35 PM L A Walsh <bash@tlinx.org> wrote:
>
> I was trying to find parameters to a function that gave an error, so
> I 'turned on' (included my backtracing routine), which showed:
>
> ./24bc: line 46: printf: `txt=\nRed,': not a valid identifier
> STOPPING execution @ "printf ${_:+-v $_} '\x1b[48;2;%s;%s;%sm' $1 $2 $3"
> in "setBgColor()" at ./24bc #46
> called in setBackBlack() at ./24bc #56
> called in title() at ./24bc #74
> called in main() at ./24bc #81
>
> ----
> I was all, 'rats, its not showing the params', I wondered why and looked
> at the code,
> and realized that while I can backtrace function, source line+file, I didn't
> know how to display the params that were used when the function was called.
>
> Is there, or maybe 'can there', be a BASH var like
> FUNCPARMS[1]="(P1 P2 P3)"
>
> Of course it would be handy if bash could parse this w/o using an
> intermediate var:
>
> echo "${${FUNCPARMS[@]}[1]}" =>
> # (tmp=${FUNCPARMS[@]} tmp=(P1 P2 P3) )
> # echo "${tmp[1]}"
> P1
>
> ---
> But even without the enhanced parsing output, it would still
> be useful if bash had & filled in the param vars.
>
> FUNCPARMS would parallel 'FUNCNAME', i.e.
> FUNCPARMS[1] would hold the quoted array "()" PARMS for FUNCNAME[1].
>
> FWIW, my primitive backtrace function (source or "include") follows:
>
> ----
> #!/bin/bash -u
>
> shopt -s expand_aliases
> alias my='declare ' int='my -i '
>
> backtrace () {
> trap ERR
> int level=0
> my cmd fn src ln
> int iter=0
> while {
> cmd=$BASH_COMMAND; fn=${FUNCNAME[level+1]:-}
> src=${BASH_SOURCE[level+1]:-} ln=${BASH_LINENO[level]:-}
> }; do
> [[ $fn && $src && $ln ]] && {
> if ((iter++==0)); then
> printf 'STOPPING execution @ "%s" in "%s()" at %s #%s\n' "$cmd"
> "$fn" "$src" "$ln"
> else
> printf ' called in %s() at %s #%s\n' "$fn" "$src" "$ln"
> fi
> level+=1
> continue;
> }
> exit 1
> done
> }
> set -o errtrace
> trap backtrace ERR
> trap backtrace QUIT
> set -E
>
>
>
gdb.txt
Description: Text document