タブの完了が中断されます。 straceを使って何が起こっているのかを調べることはできますか?

タブの完了が中断されます。 straceを使って何が起こっているのかを調べることはできますか?

sudo su dkay私の例では、...と入力し始め<tab>、コマンドが約1分間停止し、タブを押して完了しますsudo su dkayton

誰かが何が起こっているのかを理解するためにstraceを使用するように提案しました。

タブを完成させるための基本コマンドをstraceに渡す方法についてのアイデアはありますか?

私が試したこと:

topプロセスを監視するためにシェルで実行されています。その後、すぐにsudo su dkay別のシェルでTabキーを押しました。

次に、できるだけ早くbashプロセスのPIDをコピーし、sudo strace -pXXX -tfo /tmp/strace.log3番目のシェルを作成しました。ここで、XXXはコピーされたPIDです。

それでも2MBを超えるログをキャプチャしています。私はそれを2回繰り返し、2番目はより成功しました。

私はこれを行うより自動的な方法を探しています。

答え1

(Linuxを使用していると仮定)echo $$現在のシェルのPIDを取得します。新しい端末を開き、次を実行します。

sudo strace -fp <PID> -o log

以前のシェルに戻ってタブを完成させてください。その後、新しい端末に切り替えてCtrlC終了を押しますstrace。出力は、同じシェルでコマンドを実行するlogこともできます(まず、資格情報をキャッシュするように認証)。stracesudo

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

それからタブを完成させてください。それを殺すには、fgその後CtrlC

しかし、bashを使用している場合は、まず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 == */* ]]

関連情報