탭 완료가 중단됩니다. 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.log세 번째 셸을 생성했습니다. 여기서 XXX는 복사된 PID입니다.

여전히 2MB가 넘는 로그를 캡처했습니다. 나는 그것을 두 번 반복했고 두 번째에는 더 성공적이었습니다.

저는 이 작업을 수행하는 보다 자동적인 방법을 찾고 있습니다.

답변1

(Linux를 사용한다고 가정) echo $$현재 쉘의 PID를 가져옵니다. 새 터미널을 열고 다음을 실행합니다.

sudo strace -fp <PID> -o log

이전 셸로 다시 전환하고 탭 완성을 시도해 보세요. 그런 다음 새 터미널로 전환하고 CtrlCend 를 누르십시오 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 == */* ]]

관련 정보