Autocomplete
我有一個掛起的選項卡完成,是否可以使用 strace 來找出發生了什麼?
在我的範例中,我開始輸入
sudo su dkay
…<tab>
… 並且該命令在選項卡完成之前掛起大約一分鐘sudo su dkayton
。我被建議使用 strace 來找出發生了什麼。
關於如何將製表符完成的底層命令傳遞給 strace 的任何想法?
我嘗試了什麼:
我
top
在一個 shell 中執行以監視程序。sudo su dkay
然後我在另一個外殼中立即點擊標籤。然後,我盡可能快地複制了 bash 程序的 PID,這導致
sudo strace -pXXX -tfo /tmp/strace.log
了第三個 shell,其中 XXX 是複制的 PID。它仍然設法擷取超過 2mb 的日誌。我重複了兩次,第二次更成功。
我正在尋找一種更自動的方式來完成這項工作。
(假設您使用的是 Linux)
echo $$
用於獲取目前 shell 的 PID。打開一個新終端,然後執行:sudo strace -fp <PID> -o log
切換回舊 shell,嘗試 tab 補全。然後切換到新終端並按
Ctrl``C
結束strace
。輸出將在名為log
.strace
您還可以在同一個 shell 中執行該命令(首先進行身份驗證以sudo
記憶體憑據):sudo -v sudo strace -fp $$ -o log &
然後嘗試製表符完成。要殺死它,
fg
,然後是Ctrl``C
。但是,如果您使用的是 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 == */* ]]