sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

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