Skip to content

Commit c02d299

Browse files
author
Michael Jennings
committed
Add bash_stack_trace() function for printing BASH backtrace info. Also add file/line/function info to PS4 for xtrace output.
1 parent a1c012a commit c02d299

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

nhc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ function nhcmain_init_env() {
188188

189189
# Static variables
190190
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
191+
PS4='>[${BASH_SOURCE##*/}:${LINENO}:${FUNCNAME[0]}()]> '
191192
SYSCONFIGDIR="/etc/sysconfig"
192193
LIBEXECDIR="/usr/libexec"
193194
if [[ -r /proc/sys/kernel/hostname ]]; then
@@ -208,7 +209,7 @@ function nhcmain_init_env() {
208209
FORCE_SETSID=1
209210
NHC_FD_OUT=1
210211
NHC_FD_ERR=2
211-
export PATH SYSCONFIGDIR LIBEXECDIR HOSTNAME HOSTNAME_S RET LOGGER_TEXT
212+
export PATH PS4 SYSCONFIGDIR LIBEXECDIR HOSTNAME HOSTNAME_S RET LOGGER_TEXT
212213
export NHC_PID NHC_START_TS WATCHDOG_PID FAIL_CNT FORCE_SETSID NHC_FD_OUT NHC_FD_ERR
213214

214215
# Users may override this in /etc/sysconfig/nhc.

scripts/common.nhc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,35 @@ function array_join() {
115115
fi
116116
fi
117117
}
118+
119+
### Show a stack trace of bash functions and file locations
120+
function bash_stack_trace() {
121+
local FRAME ARGS ARGC i
122+
local -a ARGV=( "${BASH_ARGV[@]}" )
123+
124+
for ((FRAME=1; FRAME < ${#FUNCNAME[*]}; FRAME++)); do
125+
ARGS=""
126+
if shopt -q extdebug; then
127+
ARGC=${BASH_ARGC[$FRAME]:-0}
128+
if [[ $ARGC -gt 0 ]]; then
129+
for ((i=1; i <= ARGC; i++)); do
130+
if [[ ${ARGV[ARGC-i]} == *[[:space:]]* ]]; then
131+
ARGV[ARGC-i]=\"${ARGV[ARGC-i]//\"/\\\"}\"
132+
fi
133+
ARGS+=${ARGV[ARGC-i]}', '
134+
if [[ $ARGC -eq $i ]]; then
135+
### FIXME: BASH bug? "unset ARGV[0]" deletes the whole array!
136+
ARGV=( "${ARGV[@]:1}" )
137+
else
138+
unset ARGV[ARGC-i]
139+
fi
140+
done
141+
ARGS="${ARGS%, }"
142+
fi
143+
fi
144+
echo "[BT]: ${FUNCNAME[$FRAME]}($ARGS) at ${BASH_SOURCE[$FRAME]:-<UNK-FILE>}:${BASH_LINENO[$((FRAME-1))]:-<UNK-LINE>}"
145+
done
146+
}
118147
###########################################################
119148

120149
# Define regexp match check conditionally based on bash version.

0 commit comments

Comments
 (0)