diff options
author | Starfall <us@starfall.systems> | 2024-01-08 09:40:24 -0600 |
---|---|---|
committer | Starfall <us@starfall.systems> | 2024-01-08 09:40:24 -0600 |
commit | a91d41375fc87c958f0b4b2ec09d5bfa2bab9414 (patch) | |
tree | 5ecf2d3f5b5962bb2d317ad4ce1fddd88e8b0ed7 /noarch/bash_debugging |
Diffstat (limited to 'noarch/bash_debugging')
-rwxr-xr-x | noarch/bash_debugging | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/noarch/bash_debugging b/noarch/bash_debugging new file mode 100755 index 0000000..4b31c54 --- /dev/null +++ b/noarch/bash_debugging @@ -0,0 +1,112 @@ +# +# This file contains "bash"-specific debugging support utility functions. +# +# NOTE: This file must be "sourced" (not executed). +# +# WARNING: This file depends on functions from "run_time_utils" file. + +_print_call_stack() { + _report "call stack:" + local X_INDENT="${X_INDENT}${X_INDENT_STEP}" + #_report "[0]=${BASH_SOURCE[0]}:?:${FUNCNAME[$i]}" + for ((i=1, j=0; i<${#FUNCNAME[@]}; ++i, ++j)) ; do + _report "[$i]=${BASH_SOURCE[$i]}:${BASH_LINENO[$j]}:${FUNCNAME[$i]}" + done +} + +_get_caller_location() { + local CALL_STACK_OFFSET=$(( 1 + ${CALL_STACK_OFFSET:-0} )) + + local CALLER_LOCATION="${BASH_SOURCE[${CALL_STACK_OFFSET}]}:${BASH_LINENO[$(( ${CALL_STACK_OFFSET} - 1 ))]}:${FUNCNAME[${CALL_STACK_OFFSET}]}" + + echo "${CALLER_LOCATION}" +} + +# +# Aborts execution printing diagnostic message. +# +_abort_execution() { + if [ $# -ne 0 ] ; then + _report_error "ABORT: '$@', execution aborted" + else + _report_error "ABORT: execution aborted" + fi + _print_call_stack + exit 1 +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# +# Scripts debugging support. +# + +# +# Outputs arguments to "stderr" if "DEBUG_STDERR" environment variable is not +# empty. +# +# Appends arguments to "${DEBUG_LOG_FILE}" file if "DEBUG_LOG_FILE" environment +# variable is not empty. +# +# Appends arguments to "${SCRIPT_LOG_FILE}" file if "SCRIPT_LOG_FILE" +# environment variable is not empty. +# +# Appends arguments to "${PACKAGE_LOG_FILE}" file if "PACKAGE_LOG_FILE" +# environment variable is not empty. +# +log_message() { + local CALL_STACK_OFFSET="$(( 1 + ${CALL_STACK_OFFSET:-0} ))" + local CALLER_LOCATION="$(_get_caller_location)" + local PID="$$" + local LOG_MSG="${PID} ${CALLER_LOCATION} $@" + + if [ -n "${DEBUG_STDERR}" ] ; then + >&2 echo "DEBUG: ${LOG_MSG}" + fi + + if [ -n "${DEBUG_LOG_FILE}" ] ; then + >>"${DEBUG_LOG_FILE}" echo "${LOG_MSG}" + fi + + if [ -n "${SCRIPT_LOG_FILE}" ] ; then + >>"${SCRIPT_LOG_FILE}" echo "${LOG_MSG}" + fi + + if [ -n "${PACKAGE_LOG_FILE}" ] ; then + >>"${PACKAGE_LOG_FILE}" echo "${LOG_MSG}" + fi +} + +# +# Depending on enabled debug outputs copies everything from "stdin" into one of +# "${PACKAGE_LOG_FILE}", "${SCRIPT_LOG_FILE}", "${DEBUG_LOG_FILE}", "stderr" or +# simply discards everything. +# +log_redirected_output() { + local CALL_STACK_OFFSET="$(( 1 + ${CALL_STACK_OFFSET:-0} ))" + + #log_message "vvvvv redirected_output vvvvv" + if [ -n "${PACKAGE_LOG_FILE}" ] ; then + >>"${PACKAGE_LOG_FILE}" cat + elif [ -n "${SCRIPT_LOG_FILE}" ] ; then + >>"${SCRIPT_LOG_FILE}" cat + elif [ -n "${DEBUG_LOG_FILE}" ] ; then + >>"${DEBUG_LOG_FILE}" cat + elif [ -n "${DEBUG_STDERR}" ] ; then + >&2 cat + else + >/dev/null cat + fi + #log_message "^^^^^ redirected_output ^^^^^" +} + +# +# Outputs variable name and value to debug log. +# +log_variable() { + local CALL_STACK_OFFSET="$(( 1 + ${CALL_STACK_OFFSET:-0} ))" + + if [ -z "$1" ] ; then _abort_execution "variable name unspecified" ; fi + #log_message $(eval echo "${1}=\${${1}}") + log_message $(eval echo "\"${1}='\${${1}}'\"") +} |