Autocomplete

我有一個掛起的選項卡完成,是否可以使用 strace 來找出發生了什麼?

  • June 18, 2019

在我的範例中,我開始輸入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 == */* ]]

引用自:https://unix.stackexchange.com/questions/525578