perf (auch perf_events) ist das offizielle Performance-Analyse-Werkzeug des Linux-Kernels. Es nutzt die Hardware-Leistungszähler der CPU (PMU) und Kernel-Tracepoints, um zu messen, wo ein Programm Zeit verbringt — vom einfachen Event-Zählen bis zur detaillierten Aufruf-Analyse mit Call-Graphen.
Die wichtigsten Unterbefehle
perf list # verfügbare Events auflisten
perf stat ./programm # Events zählen (Zyklen, Instructions, Cache-Misses)
perf record ./programm # Sampling: Samples in perf.data schreiben
perf report # gesammelte Daten analysieren
perf top # Live-Ansicht wie top, nach CPU-Anteil sortiert
Praxis-Beispiele
perf statzeigt standardmäßig Zyklen, Instructions, Cache-Misses und Branch-Misses; mit-ewählt man eigene Events:perf stat -e cycles,instructions,cache-misses ./programm- Sampling mit Call-Graph:
perf record -g ./programm—perf report --tuiöffnet danach die interaktive Hotspot-Ansicht - An einen laufenden Prozess anhängen:
perf top -p <PID>oderperf record -p <PID> - Sampling-Frequenz setzen:
perf record -F 99 ./programm(99 Hz, bewährt für Aufruf-Profile) - Mit
perf record -gundperf scriptlassen sich Flamegraphs erzeugen (perf script | flamegraph.pl) perf tracezeigt Systemaufrufe ähnlich wiestrace,perf schedanalysiert den Scheduler
Abgrenzung
Während strace-Befehle Systemaufrufe verfolgt und Valgrind-Befehle Speicherfehler finden, ist perf der Standard für CPU-Profile: Es misst die Hardware-Events direkt am Prozess und im Kernel, meist mit geringem Overhead.
Verwandte Grundlagen: ltrace-Befehle (Bibliotheksaufrufe), readelf-Befehle (ELF-Struktur).
ltrace ist ein Bibliotheksaufruf-Tracer für Linux: Es protokolliert, welche Funktionen aus dynamischen Bibliotheken (zum Beispiel libc) ein Programm aufruft — samt Argumenten und Rückgabewerten. Damit ergänzt es strace, das nur die Systemaufrufe des Kernels zeigt.
Grundlegende Aufrufe
ltrace ./programm # alle Bibliotheksaufrufe anzeigen
ltrace -c ./programm # Zusammenfassung: Aufruf-Zähler und Zeitanteile
ltrace -e malloc+free ./programm # nur bestimmte Funktionen filtern
ltrace -p <PID> # an laufenden Prozess anhängen
ltrace -S ./programm # zusätzlich Systemaufrufe zeigen
Praxis-Tipps
- Der Filter
-eakzeptiert Ausdrücke wie-e malloc+freeoder-e 'libc:*'(alle libc-Funktionen) -fverfolgt Kindprozesse,-o dateischreibt die Ausgabe in eine Datei-tbzw.-ttfügen Zeitstempel hinzu,-Tmisst die Dauer jedes Aufrufs-a Spalterichtet die Rückgabewerte an einer Spalte aus (Standard 40)
Einordnung
ltrace nutzt wie strace-Befehle die ptrace-Schnittstelle, arbeitet aber eine Ebene höher: Es zeigt die Funktionen im Userland, nicht die Syscalls. Für die Frage „welche Bibliotheksfunktion wird wie oft aufgerufen?“ ist ltrace das passende Werkzeug, während perf-Befehle die CPU-Last messen.
Verwandte Grundlagen: perf-Befehle (Performance-Profile), readelf-Befehle (ELF-Struktur).
Valgrind ist eine Werkzeug-Suite, die Programme in einer eigenen Laufzeitumgebung instrumentiert und dadurch Speicherfehler, Daten-Races und Performance-Engpässe aufspürt. Das wichtigste Werkzeug ist Memcheck (Standard), das ungültige Zugriffe, Benutzung nicht initialisierten Speichers und Speicherlecks meldet.
Speicherfehler prüfen (Memcheck)
valgrind ./programm
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./programm
valgrind --error-exitcode=1 ./programm # Exit-Code 1 bei Fehlern (CI)
Damit Valgrind Quellcode-Zeilen melden kann, muss das Programm mit Debug-Informationen übersetzt werden (gcc -g oder g++ -g). --leak-check=full zeigt jeden Speicherleck einzeln, --track-origins=yes hilft bei nicht initialisiertem Speicher, --error-exitcode=1 lässt Build-Pipelines bei gefundenen Fehlern scheitern.
Threads und Performance
valgrind --tool=helgrind ./thread-programm # Daten-Races finden
valgrind --tool=drd ./thread-programm # alternative Race-Erkennung
valgrind --tool=callgrind ./programm # Call-Graph-Profil
valgrind --tool=massif ./programm # Heap-Nutzung profilieren
Die Werkzeug-Suite umfasst Memcheck, Helgrind, DRD, Cachegrind, Callgrind und Massif. Helgrind und DRD erkennen Daten-Races in nebenläufigen Programmen, Callgrind erzeugt eine Datei callgrind.out.<pid>, die sich mit callgrind_annotate auswerten lässt; Massif schreibt massif.out.<pid> für ms_print. Cachegrind profiliert die Cache-Nutzung.
Praxis-Tipps
- Valgrind verlangsamt Programme stark (Faktor 10–50) — nur für Tests, nicht für Produktivläufe.
- Typische Meldungen:
Invalid read of size 4,definitely lost: 40 bytes. - Wer Daten-Races nicht mit Helgrind klären kann, findet Konzepte unter Race Condition.
Verwandte Grundlagen: GDB-Befehle, GCC-Befehle, strace-Befehle, objdump-Befehle, Compiler.
strace ist ein Diagnose-Werkzeug für Linux, das die Systemaufrufe (Syscalls) eines Prozesses aufzeichnet — also die Schnittstelle zwischen Programm und Kernel. Damit lässt sich sichtbar machen, welche Dateien ein Programm öffnet, welche Netzwerkverbindungen es aufbaut und warum es beim Start scheitert.
Grundlagen
strace ./programm # Syscalls eines Programms verfolgen
strace -f ./programm # auch Kindprozesse (fork) verfolgen
strace -p 1234 # an laufenden Prozess anhängen
strace -o log.txt ./programm # Ausgabe in Datei schreiben
Jede Zeile zeigt einen Systemaufruf mit Argumenten und Rückgabewert, zum Beispiel openat(AT_FDCWD, "/etc/passwd", O_RDONLY) = 3 — Datei geöffnet mit Deskriptor 3. Ein Rückgabewert von -1 ENOENT bedeutet: Die Datei existiert nicht, häufig die Ursache für Startfehler.
Gezielt filtern
strace -e trace=open,read,close ./programm # nur bestimmte Syscalls
strace -e trace=network curl https://example.org # nur Netzwerk-Syscalls
strace -c ./programm # Zusammenfassung als Statistik
strace -t -s 200 ./programm # Zeitstempel + längere Strings
Mit -e trace= lassen sich Syscall-Klassen wie file, network, process, signal oder einzelne Namen auswählen. -c druckt eine Tabelle mit Anzahl, Fehlern und Zeit je Syscall, -t ergänzt Zeitstempel und -s begrenzt die angezeigte String-Länge.
Praxis-Tipps
- Der Klassiker:
strace -e trace=open,openat ./programm 2>&1 | grep -i configzeigt, welche Konfigurationsdatei ein Programm sucht. - Für laufende Dienste
sudo strace -p <pid>verwenden — der Prozess läuft danach normal weiter (Strg-C löst ab). - strace nutzt ptrace und verlangsamt das Programm erheblich — gezielt einsetzen.
Verwandte Grundlagen: Prozess, Thread, GDB-Befehle, Valgrind-Befehle, objdump-Befehle.
objdump aus den GNU Binutils zeigt Informationen über Objekt- und Binärdateien an und arbeitet als Disassembler: Es übersetzt Maschinencode zurück in Assembler. Damit lässt sich nachvollziehen, was der Compiler aus dem Quellcode erzeugt hat, oder eine fremde Binärdatei untersuchen.
Disassembly
objdump -d ./programm # ausführbare Sektionen disassemblieren
objdump -D ./programm # alle Sektionen disassemblieren
objdump -d -M intel ./programm # Intel-Syntax (x86) statt AT&T
objdump -S ./programm # Quellcode und Assembler gemischt (mit -g)
-d disassembliert nur Sektionen, die erwartbar Code enthalten; -D nimmt alle. Auf x86-Systemen zeigt objdump standardmäßig die AT&T-Syntax — mit -M intel wechselt man zur Intel-Syntax. -S mischt den Quellcode ein, wenn das Programm mit Debug-Informationen (-g) übersetzt wurde.
Datei-Inspektion
objdump -x ./programm # alle Header und Sektionen
objdump -h ./programm # Section-Tabelle (.text, .data, .rodata)
objdump -s -j .rodata ./programm # Sektionsinhalt als Hexdump
objdump -t ./programm # Symboltabelle
-x liefert den vollständigen Überblick über ELF-Header und Sektionen, -h die Sektionstabelle mit Größen, -s den Inhalt als Hexdump und -j wählt eine Sektion aus. Die Symboltabelle (-t) zeigt Funktions- und Variablennamen.
Praxis-Tipps
- Verwandte Binutils-Werkzeuge:
nm(Symbole auflisten),readelf(ELF-Struktur),addr2line(Adresse zur Quellzeile),objcopy,size,strings. - Ein Crash-Report mit Adresse
0x401234:addr2line -e ./programm 0x401234liefert Datei und Zeile. - objdump ist der direkte Weg, die Maschinensprache hinter einem kompilierten Programm sichtbar zu machen.
Verwandte Grundlagen: Assembly-Befehle, GCC-Befehle, Linker, Valgrind-Befehle, strace-Befehle.