Handbuch zur dynamischen Ablaufverfolgung in Solaris

Kompilierung und Instrumentation

Beim Schreiben herkömmlicher Programme für Solaris konvertieren Sie den Quellcode des Programms mit einem Compiler in den ausführbaren Objektcode. Indem Sie den Befehl dtrace absetzen, rufen Sie den Compiler für die Programmiersprache D auf, in der Sie zuvor das Programm hello.d geschrieben haben. Das kompilierte Programm wird an den Betriebssystemkernel gesendet, wo es durch DTrace ausgeführt wird. Dort werden die im Programm genannten Prüfpunkte aktiviert und der entsprechende Provider nimmt die erforderliche Instrumentation vor, um sie in Funktion zu setzen.

Die gesamte Instrumentation in DTrace erfolgt vollständig dynamisch: Prüfpunkte werden einzeln und nur, wenn Sie sie verwenden, aktiviert. Für inaktive Prüfpunkte liegt kein instrumentierter Code vor, sodass das System keinerlei Leistungseinbußen erfährt, wenn DTrace nicht verwendet wird. Wenn das Experiment abgeschlossen und der Befehl dtrace beendet wird, werden alle von Ihnen verwendeten Prüfpunkte automatisch deaktiviert und ihre Instrumentation gelöscht. Dadurch kehrt das System zu exakt dem vorherigen Zustand zurück. Zwischen einem System, auf dem DTrace nicht aktiv ist, und einem System, auf dem die DTrace-Software nicht installiert ist, besteht effektiv kein Unterschied.

Die Instrumentation für jeden Prüfpunkt erfolgt dynamisch auf dem laufenden Betriebssystem oder den von Ihnen ausgewählten Benutzerprozessen. Das System wird weder stillgelegt (quiesce) noch auf eine andere Weise unterbrochen. Nur für die von Ihnen aktivierten Prüfpunkte wird Instrumentationscode hinzugefügt. Das heißt, dass die Prüftätigkeit durch die Verwendung von DTrace genau darauf beschränkt ist, was Sie von DTrace verlangen: Keine anderen Daten werden nachverfolgt, kein einzelner, großer „Tracing-Schalter“ wird im System eingeschaltet. Die gesamte Instrumentation in DTrace ist auf maximale Effizienz ausgelegt. Dank dieser Leistungsmerkmale lässt sich DTrace in der Produktionsumgebung zum Lösen echter Probleme in Echtzeit einsetzen.

Das DTrace-Framework bietet außerdem Unterstützung für eine beliebige Anzahl virtueller Clients. Sie können so viele DTrace-Experimente gleichzeitig ausführen, wie Sie für nötig halten. Dabei stellt die Speicherkapazität der Systeme die einzige Einschränkung dar. Alle Befehle arbeiten unabhängig voneinander unter Verwendung derselben zugrunde liegenden Instrumentation. Derselben Fähigkeit ist es auch zu verdanken, dass beliebig viele unterschiedliche Systembenutzer DTrace gleichzeitig einsetzen können: Entwickler, Administratoren und Wartungsfachleute können mit DTrace gemeinsam oder an getrennten Problemen auf demselben System arbeiten, ohne sich gegenseitig zu behindern.

Im Gegensatz zu Programmen in C und C++ und ähnlich wie in der Programmiersprache JavaTM geschriebene Programme werden die D-Programme in DTrace in eine sichere Zwischenform kompiliert, die bei der Auslösung der Prüfpunkte ausgeführt wird. Die Sicherheitsüberprüfung dieser Zwischenform erfolgt, wenn das Programm erstmals von der DTrace-Kernelsoftware untersucht wird. Die DTrace-Ausführungsumgebung behandelt außerdem etwaige während der Ausführung des D-Programms auftretende Laufzeitfehler, einschließlich Divisionen durch Null, Dereferenzierungen ungültiger Speicherbereiche usw., und gibt Meldungen darüber aus. Sie können also gar kein unsicheres Programm erzeugen, das DTrace dazu veranlassen würde, den Solaris-Kernel oder einen der auf dem System ausgeführten Prozesse zu beschädigen. Aufgrund dieser Sicherheitsmerkmale können Sie DTrace in Produktionsumgebungen einsetzen, ohne sich über Abstürze oder Beschädigungen des Systems Gedanken machen zu müssen. Im Fall eines Programmierfehlers meldet DTrace den Fehler und deaktiviert die Instrumentation, sodass Sie den Fehler korrigieren und einen neuen Versuch starten können. Die DTrace-Leistungsmerkmale zum Melden von Fehlern und Debuggen werden später in diesem Buch beschrieben.

Das folgende Schaubild zeigt die einzelnen Komponenten der DTrace-Architektur, einschließlich der Provider, Prüfpunkte, DTrace-Kernelsoftware und des Befehls dtrace.

Abbildung 1–1 DTrace-Architektur und -Komponenten im Überblick

DTrace-Architektur: Kernel-Dienstprogramm und Provider, eine Treiberschnittstelle zwischen Kernel und einer Bibliothek sowie die den Befehlssatz unterstützende Bibliothek.

Nun, nachdem die Funktionsweise von DTrace geklärt ist, kehren wir zur Einführung in die Programmiersprache D zurück und beginnen, einige interessantere Programme zu schreiben.