首先,我不知道这是不是一些琐碎的常识;我不知道,所以来这里问。
我正在运行一个第 3 方应用程序,并试图解决一个需要找出调用堆栈的问题。
当我调用 Bash 脚本时,它会调用许多其他脚本和二进制文件,处理内容并退出。
我需要的是一种准确找出它调用了哪些脚本和二进制文件的方法。 pstree 显示堆栈,但仅适用于当前正在执行的进程。
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
使用
bash -x
运行脚本,这将在标准错误上生成输出以显示执行的每个命令。
如果您更喜欢 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