我有一个制表符补全挂起,是否可以使用 strace 来找出发生了什么?

我有一个制表符补全挂起,是否可以使用 strace 来找出发生了什么?

在我的示例中,我开始输入sudo su dkay... <tab>...,命令挂起大约一分钟,然后 tab 完成到sudo su dkayton

有人建议我使用 strace 来了解发生了什么。

关于如何将制表符补全的底层命令传递给 strace 有什么想法吗?

我尝试过的:

top在一个 shell 中运行以监视进程。然后我立即sudo su dkay在另一个 shell 中按下 Tab 键。

然后,我尽快复制了 bash 进程的 PID,生成了sudo strace -pXXX -tfo /tmp/strace.log第三个 shell,其中 XXX 是复制的 PID。

它仍然成功捕获了超过 2mb 的日志。我重复了两次,第二次更成功。

我正在寻找一种更自动的方法来完成此任务。

答案1

(假设您使用的是 Linux)用于echo $$获取当前 shell 的 PID。打开一个新终端,然后运行:

sudo strace -fp <PID> -o log

切换回旧 shell,尝试制表符补全。然后切换到新终端并按CtrlC结束strace。输出将位于名为log.您还可以strace在同一 shell 中运行该命令(首先进行身份验证sudo以缓存凭据):

sudo -v
sudo strace -fp $$ -o log &

然后尝试制表符补全。要杀死它,fg,然后是CtrlC

但是,如果您使用的是 bash,最好先尝试从中获取详细的调试输出:

set -o functrace xtrace
PS4=' ${BASH_SOURCE}:$FUNCNAME:$LINENO: '

然后尝试制表符补全。您应该在随后的输出中执行完成函数执行的所有内容。例如:

bash-5.0$ set -o xtrace functrace
bash-5.0$ PS4=' ${BASH_SOURCE}:${FUNCNAME}:$LINENO: '
+ PS4=' ${BASH_SOURCE}:${FUNCNAME}:$LINENO: '
bash-5.0$ sudo su  /usr/local/share/bash-completion/bash_completion:_completion_loader:3: local cmd=sudo
 /usr/local/share/bash-completion/bash_completion:_completion_loader:5: __load_completion sudo
 /usr/local/share/bash-completion/bash_completion:__load_completion:2: dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions)
 /usr/local/share/bash-completion/bash_completion:__load_completion:2: local -a dirs
 /usr/local/share/bash-completion/bash_completion:__load_completion:3: local 'OIFS=
' IFS=: dir cmd=sudo compfile
 /usr/local/share/bash-completion/bash_completion:__load_completion:2021: for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
 /usr/local/share/bash-completion/bash_completion:__load_completion:5: dirs+=($dir/bash-completion/completions)
 /usr/local/share/bash-completion/bash_completion:__load_completion:2021: for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
 /usr/local/share/bash-completion/bash_completion:__load_completion:5: dirs+=($dir/bash-completion/completions)
 /usr/local/share/bash-completion/bash_completion:__load_completion:7: IFS='
'
 /usr/local/share/bash-completion/bash_completion:__load_completion:9: [[ /usr/local/share/bash-completion/bash_completion == */* ]]

相关内容