T0003.debug-trap.sh (2399B)
1 #!/bin/bash 2 3 bash44_traverse=1 4 5 function user-debug-handler { 6 local caller=${FUNCNAME[1]} 7 [[ $caller == ble-debug-handler ]] && 8 caller=${FUNCNAME[2]} 9 echo "trap($*):$caller: $BASH_COMMAND" 10 } 11 12 # * 4.4 以降では最初に DEBUG を設定した関数呼び出しレベルを書き換える? 13 # 否、関数終了時に上書きする様にしたら良いという事の気がする。 14 # * 関数を一つ上がったら trap handler を削除 15 # * trap handler が全てなくなったら解除 16 # ? yes: 内側の関数で活性化した時に外側の関数でもちゃんと DEBUG trap が発動 17 # するのだろうか。 18 19 _debug_trap_handlers=() 20 function ble/trap-debug { 21 local depth=$((${#FUNCNAME[@]}-2)) 22 if [[ $1 != - ]]; then 23 _debug_trap_handlers[depth]=$1 24 25 # 再活性化 (extdebug/functrace が設定されていなければ、 26 # 設定を行った関数呼び出しレベルでしか DEBUG trap は発生しない)。 27 builtin trap ble-debug-handler DEBUG 28 else 29 unset '_debug_trap_handlers[depth]' 30 fi 31 } 32 function ble-debug-handler { 33 local depth=$((${#FUNCNAME[@]}-1)) 34 [[ $_ble_trap_suppress || ${FUNCNAME[1]} == trap ]] && return 0 35 #echo "ble-debug-handler" 36 for ((;depth>=0;depth--)); do 37 local handler=${_debug_trap_handlers[depth]-} 38 [[ $handler ]] || continue 39 eval "$handler" 40 return "$?" 41 done 42 } 43 function ble-return-handler { 44 #echo "ble-return-handler" 45 local _ble_trap_suppress=1 46 local depth=$((${#FUNCNAME[@]}-1)) 47 ((depth)) || return 0 48 if [[ $bash44_traverse && ${_debug_trap_handlers[depth]+set} ]]; then 49 _debug_trap_handlers[depth-1]=${_debug_trap_handlers[depth]} 50 fi 51 } 52 53 #------------------------------------------------------------------------------ 54 55 function f3 { 56 builtin trap '_ble_trap_suppress=1 ble-return-handler' RETURN 57 trap 'user-debug-handler f3' DEBUG 58 echo f3 59 } 60 function f2 { 61 builtin trap '_ble_trap_suppress=1 ble-return-handler' RETURN 62 echo f2:1 63 f3 64 echo f2:2 65 trap - DEBUG 66 } 67 function f1 { 68 builtin trap '_ble_trap_suppress=1 ble-return-handler' RETURN 69 trap 'user-debug-handler f1' DEBUG 70 echo f1:1 71 f2 72 echo f1:3 73 trap - DEBUG 74 } 75 76 #------------------------------------------------------------------------------ 77 78 #trap ble-debug-handler DEBUG 79 80 # 通常 81 f1 82 83 echo ---------- 84 trap ble-return-handler RETURN 85 function trap { local _ble_trap_suppress=1; ble/trap-debug "$1"; } 86 f1