From 18b9303dfb318b2d95d8098ced7226a88cd380c8 Mon Sep 17 00:00:00 2001 From: Michal Berger Date: Fri, 24 Jan 2020 16:15:16 +0100 Subject: [PATCH] test/common: Include BASH_ARGV[]s in the backtrace Enable extdebug and try to include all the arguments passed down the function stack in the backtrace. Change-Id: I81381c936b0f895f1ca8e31d57ef8116d737c6cd Signed-off-by: Michal Berger Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/482695 Tested-by: SPDK CI Jenkins Reviewed-by: Darek Stojaczyk Reviewed-by: Ben Walker --- test/common/autotest_common.sh | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/test/common/autotest_common.sh b/test/common/autotest_common.sh index 39abbb815..8fef13765 100644 --- a/test/common/autotest_common.sh +++ b/test/common/autotest_common.sh @@ -5,6 +5,7 @@ function xtrace_disable() { XTRACE_DISABLED="yes" fi set +x + shopt -u extdebug elif [ -z $XTRACE_NESTING_LEVEL ]; then XTRACE_NESTING_LEVEL=1 else @@ -30,7 +31,7 @@ function xtrace_enable() { alias xtrace_restore=\ 'if [ -z $XTRACE_NESTING_LEVEL ]; then if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then - XTRACE_DISABLED="no"; PREV_BASH_OPTS=""; set -x; xtrace_enable; + XTRACE_DISABLED="no"; PREV_BASH_OPTS=""; shopt -s extdebug; set -x; xtrace_enable; fi else XTRACE_NESTING_LEVEL=$((--XTRACE_NESTING_LEVEL)); @@ -644,6 +645,8 @@ function print_backtrace() { # if errexit is not enabled, don't print a backtrace [[ "$-" =~ e ]] || return 0 + local args=("${BASH_ARGV[@]}") + xtrace_disable echo "========== Backtrace start: ==========" echo "" @@ -651,14 +654,24 @@ function print_backtrace() { local func="${FUNCNAME[$i]}" local line_nr="${BASH_LINENO[$((i - 1))]}" local src="${BASH_SOURCE[$i]}" - local bt="" + local bt="" cmdline=() if [[ -f $src ]]; then bt=$(nl -w 4 -ba -nln $src | grep -B 5 -A 5 "^${line_nr}[^0-9]" | \ sed "s/^/ /g" | sed "s/^ $line_nr /=> $line_nr /g") fi - echo "in $src:$line_nr -> $func()" + # If extdebug set the BASH_ARGC[i], try to fetch all the args + if (( BASH_ARGC[i] > 0 )); then + # Use argc as index to reverse the stack + local argc=${BASH_ARGC[i]} arg + for arg in "${args[@]::BASH_ARGC[i]}"; do + cmdline[argc--]="[\"$arg\"]" + done + args=("${args[@]:BASH_ARGC[i]}") + fi + + echo "in $src:$line_nr -> $func($(IFS=","; printf '%s\n' "${cmdline[*]:-[]}"))" echo " ..." echo "${bt:-backtrace unavailable}" echo " ..."