|
|
@ -8,9 +8,9 @@ SCRIPT=$1 |
|
|
# FUNCTIONS |
|
|
# FUNCTIONS |
|
|
|
|
|
|
|
|
function on_return { |
|
|
function on_return { |
|
|
if [[ "${BASH_COMMAND}" == return* ]]; then |
|
|
|
|
|
|
|
|
if [[ "${BASH_COMMAND}" == 'return '* ]]; then |
|
|
code=$(echo "${BASH_COMMAND}" | cut -d' ' -f2) # regex does not work here unfortunately! thus use of basic cut |
|
|
code=$(echo "${BASH_COMMAND}" | cut -d' ' -f2) # regex does not work here unfortunately! thus use of basic cut |
|
|
if [[ -n "$code" ]] && [[ $code -ne 0 ]]; then |
|
|
|
|
|
|
|
|
if [[ -n "$code" ]] && [[ "$code" -ne 0 ]]; then |
|
|
trap - DEBUG |
|
|
trap - DEBUG |
|
|
>&2 echo "${BASH_SOURCE[2]}: line ${BASH_LINENO[0]}: return $code from ${FUNCNAME[1]}" |
|
|
>&2 echo "${BASH_SOURCE[2]}: line ${BASH_LINENO[0]}: return $code from ${FUNCNAME[1]}" |
|
|
fi |
|
|
fi |
|
|
@ -27,7 +27,6 @@ function exit { |
|
|
|
|
|
|
|
|
function on_exit { |
|
|
function on_exit { |
|
|
code=${1:-0} |
|
|
code=${1:-0} |
|
|
>&4 dump_stderr |
|
|
|
|
|
|
|
|
|
|
|
stack_lines=("${BASH_LINENO[@]}") |
|
|
stack_lines=("${BASH_LINENO[@]}") |
|
|
stack_functions=("${FUNCNAME[@]}") |
|
|
stack_functions=("${FUNCNAME[@]}") |
|
|
@ -52,8 +51,9 @@ function on_exit { |
|
|
stack_functions=("${stack_functions[@]}") |
|
|
stack_functions=("${stack_functions[@]}") |
|
|
stack_sources=("${stack_sources[@]}") |
|
|
stack_sources=("${stack_sources[@]}") |
|
|
|
|
|
|
|
|
|
|
|
stack_summary=() |
|
|
|
|
|
|
|
|
if [[ $code -gt 0 ]]; then |
|
|
if [[ $code -gt 0 ]]; then |
|
|
$DEBUG && >/dev/tty echo '---stacktrace---' |
|
|
|
|
|
last_error=$(tail -n1 $TMP_ERROR) |
|
|
last_error=$(tail -n1 $TMP_ERROR) |
|
|
last_source=${stack_sources[0]} |
|
|
last_source=${stack_sources[0]} |
|
|
last_source=${last_source//./"\."} # replace . by \. |
|
|
last_source=${last_source//./"\."} # replace . by \. |
|
|
@ -73,25 +73,45 @@ function on_exit { |
|
|
stack_lines=("$line" "${stack_lines[@]}") |
|
|
stack_lines=("$line" "${stack_lines[@]}") |
|
|
stack_functions=("$funcname" "${stack_functions[@]}") |
|
|
stack_functions=("$funcname" "${stack_functions[@]}") |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
>&4 echo -e "ERROR $code: [$message]" |
|
|
|
|
|
|
|
|
stack_summary+=("ERROR $code: [$message]") |
|
|
else |
|
|
else |
|
|
>&4 echo "ERROR $code: <undefined>" |
|
|
|
|
|
|
|
|
stack_summary+=("ERROR $code: <undefined>") |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
for i in "${!stack_functions[@]}"; do |
|
|
for i in "${!stack_functions[@]}"; do |
|
|
>&4 printf "\t%30s\t%s\n" "${stack_sources[$i]}:${stack_lines[$i]}" "${stack_functions[$i]}" |
|
|
|
|
|
|
|
|
stack_detail=$(printf "\t%30s\t%s\n" "${stack_sources[$i]}:${stack_lines[$i]}" "${stack_functions[$i]}") |
|
|
|
|
|
stack_summary+=("$stack_detail") |
|
|
done |
|
|
done |
|
|
|
|
|
>&4 dump_stderr true |
|
|
|
|
|
dump_summary |
|
|
|
|
|
else |
|
|
|
|
|
>&4 dump_stderr false |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
cleanup |
|
|
cleanup |
|
|
builtin exit $code |
|
|
builtin exit $code |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function dump_summary { |
|
|
|
|
|
$DEBUG && >/dev/tty echo '---stacktrace---' |
|
|
|
|
|
for i in "${stack_summary[@]}"; do |
|
|
|
|
|
>&4 echo -e "$i" |
|
|
|
|
|
done |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
function dump_stderr { |
|
|
function dump_stderr { |
|
|
if [[ -s $TMP_ERROR ]]; then |
|
|
|
|
|
|
|
|
last_trim=${1:-false} |
|
|
|
|
|
mapfile -t tmp_error <$TMP_ERROR |
|
|
|
|
|
if $last_trim; then |
|
|
|
|
|
echo "${#tmp_error[@]}" |
|
|
|
|
|
unset tmp_error[-1] |
|
|
|
|
|
tmp_error=("${tmp_error[@]}") |
|
|
|
|
|
fi |
|
|
|
|
|
if [[ "${#tmp_error[@]}" -gt 0 ]]; then |
|
|
$DEBUG && >/dev/tty echo '---stderr---' |
|
|
$DEBUG && >/dev/tty echo '---stderr---' |
|
|
cat $TMP_ERROR |
|
|
|
|
|
|
|
|
for i in "${tmp_error[@]}"; do |
|
|
|
|
|
echo -e "$i" |
|
|
|
|
|
done |
|
|
fi |
|
|
fi |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|