7.8. Compiler und Entwicklungswerkzeuge (Maschinenübersetzung)

Synthetische Funktionen, die von GCC generiert werden, verwirren SystemTap

Die GCC-Optimierung kann synthetische Funktionen für teilweise inlinierte Kopien anderer Funktionen erzeugen. Tools wie SystemTap und GDB können diese synthetischen Funktionen nicht von realen Funktionen unterscheiden. Infolgedessen kann SystemTap Sonden sowohl an synthetischen als auch an realen Funktionseintrittspunkten platzieren und so mehrere Sondentreffer für einen einzigen realen Funktionsaufruf registrieren.

Um dieses Problem zu umgehen, müssen SystemTap-Skripte mit Maßnahmen wie dem Erkennen von Rekursionen und dem Unterdrücken von Sonden, die sich auf inlinierte Teilfunktionen beziehen, angepasst werden. Zum Beispiel ein Skript

probe kernel.function("can_nice").call { }

kann versuchen, das beschriebene Problem wie folgt zu vermeiden:

global in_can_nice%

probe kernel.function("can_nice").call {
  in_can_nice[tid()] ++;
  if (in_can_nice[tid()] > 1) { next }
  /* code for real probe handler */
}

probe kernel.function("can_nice").return {
  in_can_nice[tid()] --;
}

Beachten Sie, dass dieses Beispielskript nicht alle möglichen Szenarien berücksichtigt, wie z.B. verpasste Kprobes oder Kretprobes oder wirklich beabsichtigte Rekursionen.

(BZ#1169184)

Das ltraceTool meldet keine Funktionsaufrufe

Aufgrund der Verbesserungen der binären Härtung, die auf alle RHEL-Komponenten angewendet werden, kann das ltraceTool Funktionsaufrufe in Binärdateien von RHEL-Komponenten nicht mehr erkennen. Infolgedessen ist die ltraceAusgabe leer, da sie bei Verwendung in solchen Binärdateien keine erkannten Aufrufe meldet. Es ist derzeit kein Workaround verfügbar.

Als Hinweis ltracekann man Aufrufe in benutzerdefinierten Binärdateien, die ohne die entsprechenden Härtungsflags erstellt wurden, korrekt melden.

(BZ#1618748, BZ#1655368)