bash stack trace caller array
stacktrace ()
{
declare frame=0
declare argv_offset=0
while caller_info=( $(caller $frame) ) ; do
if shopt -q extdebug ; then
declare argv=()
declare argc
declare frame_argc
for ((frame_argc=${BASH_ARGC[frame]},frame_argc--,argc=0; frame_argc >= 0; argc++, frame_argc--)) ; do
argv[argc]=${BASH_ARGV[argv_offset+frame_argc]}
case "${argv[argc]}" in
*[[:space:]]*) argv[argc]="'${argv[argc]}'" ;;
esac
done
argv_offset=$((argv_offset + ${BASH_ARGC[frame]}))
echo ":: ${caller_info[2]}: Line ${caller_info[0]}: ${caller_info[1]}(): ${FUNCNAME[frame]} ${argv[*]}"
fi
frame=$((frame+1))
done
if [[ $frame -eq 1 ]] ; then
caller_info=( $(caller 0) )
echo ":: ${caller_info[2]}: Line ${caller_info[0]}: ${caller_info[1]}"
fi
}