在 Bash 中显示调用堆栈

问题描述 投票:0回答:3

首先,我不知道这是不是一些琐碎的常识;我不知道,所以来这里问。

我正在运行一个第 3 方应用程序,并试图解决一个需要找出调用堆栈的问题。

当我调用 Bash 脚本时,它会调用许多其他脚本和二进制文件,处理内容并退出。

我需要的是一种准确找出它调用了哪些脚本和二进制文件的方法。 pstree 显示堆栈,但仅适用于当前正在执行的进程。

linux bash trace
3个回答
15
投票
function stacktrace { 
   local i=1 line file func
   while read -r line func file < <(caller $i); do
      echo >&2 "[$i] $file:$line $func(): $(sed -n ${line}p $file)"
      ((i++))
   done
}

来自 https://gitlab.com/kyb/autorsync/-/blob/master/utils.bash#L84


3
投票

使用

bash -x
运行脚本,这将在标准错误上生成输出以显示执行的每个命令。


0
投票

如果您更喜欢 oneliner 跟踪(我发现它方便记录),这里是示例:

#!/bin/bash

trace() {
    local i pref="TRACE: "
    for (( i=${#FUNCNAME[@]}-1; i; i-- )); do
        echo -n "$pref${FUNCNAME[i]}[${BASH_LINENO[i-1]}]"
        pref=" -> "
    done
    echo ": $1"
}

# Test:

func_a() {
    count=-1
    (( count > 0 )) || trace "Unexpected count value: $count"
}

func_b() {
    func_a
}

func_c() {
    func_b
}

func_c

输出为:

TRACE: main[27] -> func_c[24] -> func_b[20] -> func_a[16]: Unexpected count value: -1
© www.soinside.com 2019 - 2024. All rights reserved.