Terminal Debugging mit strace
Seit neustem erzeugt der Start meines Terminals eine Fehlermeldung. Wo ist der Fehler zu beheben? Immerhin werden beim Start gefühlt hundert Dateien gelesen. Hier hilft strace
beim Debugging.
So schaut das aus, seit neustem beschwert sich meine bash-Shell beim Start, dass sie das ng
Kommando nicht finden kann. Das ist das Angular Command line interface (CLI) welches da fehlt - aber wo habe ich das verwendet? Immerhin besteht die Startsequenz einer Shell aus dem Einlesen zahlreicher Dateien. Irgendwo wird der Fehler schon stecken - aber wo?
echo exit | strace bash -li |& grep '^open' | grep -v '/dev/null\|ENOENT' | cut -d "\"" -f 2
An der Stelle kommt das Kommando strace
zur Hilfe, das auf meinem Ubuntu Linux bereits installiert ist. Das Werkzeug verfolgt Systemaufrufe, zB jene zum Öffnen von Dateien. Indem ich eine neue Shell starte und dabei strace
protokollieren lasse, komme ich dem Rätsel auf die Spur. Und was bedeuten die Teile des Kommandos oben?
echo exit | strace bash -li
Ich erzeuge eine neue interaktive (-i) Login-Shell (-l) - und schließe sie direkt wieder (echo exit). Damit protokolliert strace exakt einen Startvorgang.|& grep '^open'
Mich interessieren nur die Meldungen zum öffnen von Dateien. Interessant ist die spezielle Pipe|&
- die leitet nämlich STDOUT und STDERR weiter, wohingegen die normale Pipe|
nur STDOUT weiterleitet.| grep -v '/dev\|ENOENT'
Aber nicht die Zugriffe auf Linux Devices oder jene, die nicht erfolgreich waren, weil es die angefragte Datei nicht gibt.| cut -d "\"" -f 2
Und schließlich nehme ich aus der Ausgabe nur den Dateinamen heraus, um es übersichtlicher zu machen.
So schaut das Ergebnis bei mir aus:
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libtinfo.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/locale/locale-archive
/usr/share/locale/locale.alias
/usr/lib/locale/C.utf8/LC_IDENTIFICATION
/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
/usr/lib/locale/C.utf8/LC_MEASUREMENT
/usr/lib/locale/C.utf8/LC_TELEPHONE
/usr/lib/locale/C.utf8/LC_ADDRESS
/usr/lib/locale/C.utf8/LC_NAME
/usr/lib/locale/C.utf8/LC_PAPER
/usr/lib/locale/C.utf8/LC_MESSAGES
/usr/lib/locale/C.utf8/LC_MESSAGES/SYS_LC_MESSAGES
/usr/lib/locale/C.utf8/LC_MONETARY
/usr/lib/locale/C.utf8/LC_COLLATE
/usr/lib/locale/C.utf8/LC_TIME
/usr/lib/locale/C.utf8/LC_NUMERIC
/usr/lib/locale/C.utf8/LC_CTYPE
/etc/nsswitch.conf
/etc/passwd
/lib/terminfo/x/xterm-256color
/etc/profile
/etc/bash.bashrc
/etc/profile.d/
/etc/profile.d/01-locale-fix.sh
/etc/profile.d/Z97-byobu.sh
/etc/profile.d/Z99-cloud-locale-test.sh
/etc/profile.d/Z99-cloudinit-warnings.sh
/etc/profile.d/apps-bin-path.sh
/etc/profile.d/bash_completion.sh
/usr/share/bash-completion/bash_completion
/etc/init.d/
/etc/bash_completion.d/
/etc/bash_completion.d/apport_completion
/etc/bash_completion.d/azure-cli
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt
/etc/bash_completion.d/mvn
/etc/profile.d/cedilla-portuguese.sh
/etc/profile.d/gawk.sh
/etc/profile.d/maven.sh
/etc/profile.d/update-motd.sh
/etc/profile.d/vte-2.91.sh
/home/christian/.bash_profile
/home/christian/.profile
/home/christian/.bashrc
/home/christian/.bash_history
/usr/share/bash-completion/bash_completion
/etc/init.d/
/etc/bash_completion.d/
/etc/bash_completion.d/apport_completion
/etc/bash_completion.d/azure-cli
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt
/etc/bash_completion.d/mvn
/home/christian/.nvm/nvm.sh
/home/christian/.nvm/bash_completion
/home/christian/.rvm/scripts/rvm
/home/christian/.rvm/scripts/base
/home/christian/.rvm/scripts/initialize
/home/christian/.rvm/scripts/functions/selector
/home/christian/.rvm/scripts/functions/selector_gemsets
/home/christian/.rvm/scripts/functions/selector_late
/home/christian/.rvm/scripts/functions/selector_parse
/home/christian/.rvm/scripts/functions/selector_interpreters
/home/christian/.rvm/scripts/functions/logging
/home/christian/.rvm/scripts/functions/support
/home/christian/.rvm/scripts/functions/db
/home/christian/.rvm/scripts/functions/detect/system
/home/christian/.rvm/scripts/functions/detect/system_version/codename
/home/christian/.rvm/scripts/functions/detect/system_name/lsb_release
/home/christian/.rvm/scripts/functions/detect/system_name/os_release
/home/christian/.rvm/scripts/functions/utility
/home/christian/.rvm/scripts/functions/utility_logging
/home/christian/.rvm/scripts/functions/utility_package
/home/christian/.rvm/scripts/functions/utility_rubygems
/home/christian/.rvm/scripts/functions/utility_system
/home/christian/.rvm/scripts/functions/init
/home/christian/.rvm/scripts/functions/cleanup
/home/christian/.rvm/scripts/functions/env
/home/christian/.rvm/scripts/functions/rvmrc
/home/christian/.rvm/scripts/functions/rvmrc_env
/home/christian/.rvm/scripts/functions/rvmrc_project
/home/christian/.rvm/scripts/functions/rvmrc_set
/home/christian/.rvm/scripts/functions/rvmrc_to
/home/christian/.rvm/scripts/functions/rvmrc_trust
/home/christian/.rvm/scripts/functions/rvmrc_warning
/home/christian/.rvm/scripts/functions/install
/home/christian/.rvm/scripts/functions/environment
/home/christian/.rvm/scripts/functions/gemset
/home/christian/.rvm/scripts/functions/checksum
/home/christian/.rvm/scripts/functions/list
/home/christian/.rvm/scripts/functions/version
/home/christian/.rvm/scripts/functions/selector
/home/christian/.rvm/scripts/functions/selector_gemsets
/home/christian/.rvm/scripts/functions/selector_late
/home/christian/.rvm/scripts/functions/selector_parse
/home/christian/.rvm/scripts/functions/selector_interpreters
/home/christian/.rvm/scripts/cd
/home/christian/.rvm/scripts/extras/bash_zsh_support/chpwd/function.sh
/home/christian/.rvm/scripts/functions/cli
/home/christian/.rvm/scripts/functions/version
/home/christian/.rvm/scripts/cli
/home/christian/.rvm/scripts/override_gem
/home/christian/.rvm/scripts/rvm
/home/christian/.bash_history
/etc/inputrc
/home/christian/.bash_logout
Spannend, was da alles gelesen wird. Diese Liste schaue ich jetzt durch, die vielen .rvm
Einträge sind mir dabei egal. Und siehe da, in der Datei .bashrc
finde ich:
# Load Angular CLI autocompletion.
source <(ng completion script)
Jo, das kann nicht gehen. Weg damit. Endlich Ruhe beim Start, und was über strace
gelernt. Happy debugging!