Software Berater Logo Software Berater #neuland seit 1993

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.

Terminal startup error

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?

  1. 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.
  2. |& 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.
  3. | grep -v '/dev\|ENOENT'
    Aber nicht die Zugriffe auf Linux Devices oder jene, die nicht erfolgreich waren, weil es die angefragte Datei nicht gibt.
  4. | 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!