加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash:如何在错误上获得调用链?

发布时间:2020-12-15 16:59:31 所属栏目:安全 来源:网络整理
导读:我在bash中有一个后跟踪功能,运行良好(下面的代码),但问题是当它遇到错误时bash本身,它没有给出回溯或任何有助于确定调用者的信息,可以帮助调试问题. 例如.: ./c.sh: line 23: urgh: command not found function backtrace () { local deptn=${#FUNCNAME[@]
我在bash中有一个后跟踪功能,运行良好(下面的代码),但问题是当它遇到错误时bash本身,它没有给出回溯或任何有助于确定调用者的信息,可以帮助调试问题.

例如.:

./c.sh: line 23: urgh: command not found

function backtrace () {
    local deptn=${#FUNCNAME[@]}

    for ((i=1; i<$deptn; i++)); do
        local func="${FUNCNAME[$i]}"
        local line="${BASH_LINENO[$((i-1))]}"
        local src="${BASH_SOURCE[$((i-1))]}"
        printf '%*s' $i '' # indent
        echo "at: $func(),$src,line $line"
    done
}

是否有可能在这些错误上捕获bash所以我可以调用自己的函数来获得这样的输出?

at: c(),./c.sh,line 22
  at: b(),line 11
   at: main(),./b.sh,line 5

更新:建议和跟踪陷阱的最终工作版本出错:

function backtrace () {
    local deptn=${#FUNCNAME[@]}

    for ((i=1; i<$deptn; i++)); do
        local func="${FUNCNAME[$i]}"
        local line="${BASH_LINENO[$((i-1))]}"
        local src="${BASH_SOURCE[$((i-1))]}"
        printf '%*s' $i '' # indent
        echo "at: $func(),line $line"
    done
}

function trace_top_caller () {
    local func="${FUNCNAME[1]}"
    local line="${BASH_LINENO[0]}"
    local src="${BASH_SOURCE[0]}"
    echo "  called from: $func(),line $line"
}

set -o errtrace
trap 'trace_top_caller' ERR
绝对 – 这正是错误陷阱的用途:
trap backtrace ERR

在过去,我隐约回想起有必要让那些东西更像陷阱“回溯”${#BASH_SOURCE [@]}“”${BASH_SOURCE [@]}“”${#BASH_LINENO [@]}“”${BASH_LINENO [@]}“’ERR解决一个错误(并从函数的argv中读取数组值);但是,我现在还不记得那个bug是什么以及它受影响的版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读