Dieses Kapitel befasst sich mit der anonymen Ablaufverfolgung, die an keinen DTrace-Verbraucher gebunden ist. Die anonyme Ablaufverfolgung kommt dann zum Einsatz, wenn keine DTrace-Verbraucherprozesse ausgeführt werden können. Am häufigsten wird die anonyme Ablaufverfolgung von Gerätetreiberentwicklern zum Debuggen und Verfolgen der Aktivität während des Systemstarts genutzt. Jede interaktive Ablaufverfolgung kann auch anonym durchgeführt werden. Allerdings kann nur der Superuser anonyme Aktivierungen erstellen und es ist zu einem gegebenen Zeitpunkt nur jeweils eine anonyme Aktivierung möglich.
Zum Erstellen einer anonymen Aktivierung geben Sie die Option -A mit einem dtrace(1M)-Aufruf an, der die gewünschten Prüfpunkte, Prädikate, Aktionen und Optionen enthält. dtrace fügt der Konfigurationsdatei des dtrace(7D)-Treibers (in der Regel /kernel/drv/dtrace.conf) eine Reihe von Treibereigenschaften hinzu, die Ihrer Anforderung entsprechen. dtrace(7D)-Treiber eingelesen, wenn dieser geladen wird. Der Treiber aktiviert die angegebenen Prüfpunkte mit den angegebenen Aktionen und stellt für die neue Aktivierung einen anonymen Status her. dtrace(7D)-Treiber wie alle als DTrace-Provider fungierenden Treiber nach Bedarf geladen. dtrace(7D)-Treiber so früh wie möglich geladen werden. dtrace fügt die erforderlichen forceload-Anweisungen für jeden benötigten DTrace-Provider sowie für system(4) selbst in /etc/system hinzu (siehe dtrace(7D)).
dtrace(7D) ausgegeben, die darauf hinweist, dass die Konfigurationsdatei erfolgreich verarbeitet wurde.
Sämtliche Optionen, einschließlich Puffergröße, Größe dynamischer Variablen, Spekulationsgröße, Anzahl der Spekulationen usw., können mit anonymer Aktivierung gesetzt werden.
Zum Löschen einer anonymen Aktivierung geben Sie dtrace mit der Option -A und ohne Prüfpunktbeschreibungen an.
Nachdem das System vollständig gebootet hat, kann durch Angabe der Option -a mit dtrace jeder anonyme Status gefordert werden. Standardmäßig bewirkt -a, dass der anonyme Status gefordert wird, die vorhandenen Daten verarbeitet werden und die Ausführung fortgesetzt wird. Um den anonymen Status zu nutzen (zu „verbrauchen“) und den Vorgang zu beenden, fügen Sie die Option -e hinzu.
Ein anonymer Status, der einmal verbraucht wurde, kann nicht mehr im Kernel ersetzt werden: Die kernelinternen Puffer, die ihn enthielten, werden zu neuen Zwecken wieder verwendet. Wenn Sie versuchen, einen nicht existierenden anonymen Ablaufverfolgungsstatus zu fordern, gibt dtrace eine ähnliche Meldung wie in folgendem Beispiel aus:
dtrace: could not enable tracing: No anonymous tracing state |
Sollten Fehler oder Auslassungen auftreten, generiert dtrace bei der Forderung des anonymen Status die entsprechenden Meldungen. Die Meldungen über Fehler oder Auslassungen im anonymen oder nicht anonymen Status sind identisch.
Das folgende Beispiel zeigt eine anonyme DTrace-Aktivierung für jeden Prüfpunkt im Modul iprb(7D):
# dtrace -A -m iprb dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
Nach dem Neustart gibt dtrace(7D) auf der Konsole eine Meldung aus, die Sie darüber informiert, dass die angegebenen Prüfpunkte aktiviert werden:
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (:iprb::) NOTICE: enabling probe 1 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
Nachdem das System neu gestartet ist, kann der anonyme Status durch Angabe der Option -a mit dtrace verbraucht werden.
# dtrace -a CPU ID FUNCTION:NAME 0 22954 _init:entry 0 22955 _init:return 0 22800 iprbprobe:entry 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22801 iprbprobe:return 0 22802 iprbattach:entry 0 22874 iprb_getprop:entry 0 22875 iprb_getprop:return 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22870 iprb_self_test:entry 0 22871 iprb_self_test:return 0 22958 iprb_hard_reset:entry 0 22959 iprb_hard_reset:return 0 22862 iprb_get_eeprom_size:entry 0 22826 iprb_shiftout:entry 0 22828 iprb_raiseclock:entry 0 22829 iprb_raiseclock:return ... |
Das folgende Beispiel konzentriert sich auf die aus iprbattach() aufgerufenen Funktionen. Geben Sie das folgende Skript in einen Texteditor ein und speichern Sie es unter dem Namen iprb.d.
fbt::iprbattach:entry { self->trace = 1; } fbt::: /self->trace/ {} fbt::iprbattach:return { self->trace = 0; }
Führen Sie die folgenden Befehle aus, um die vorigen Einstellungen aus der Treiberkonfigurationsdatei zu löschen, die neue Anforderung einer anonymen Ablaufverfolgung zu installieren und das System neu zu starten:
# dtrace -AFs iprb.d dtrace: cleaned up old anonymous enabling in /kernel/drv/dtrace.conf dtrace: cleaned up forceload directives in /etc/system dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
Nach dem Neustart gibt dtrace(7D) eine andere Meldung auf der Konsole aus, die auf die geringfügig abweichende Aktivierung hinweist:
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (fbt::iprbattach:entry) NOTICE: enabling probe 1 (fbt:::) NOTICE: enabling probe 2 (fbt::iprbattach:return) NOTICE: enabling probe 3 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
Wenn das System vollständig gebootet hat, führen Sie dtrace mit der Option -a und der Option -e aus. Dadurch werden die anonymen Daten verbraucht und der Vorgang wird beendet.
# dtrace -ae CPU FUNCTION 0 -> iprbattach 0 -> gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_cache_alloc 0 -> kmem_cache_alloc_debug 0 -> verify_and_copy_pattern 0 <- verify_and_copy_pattern 0 -> tsc_gethrtime 0 <- tsc_gethrtime 0 -> getpcstack 0 <- getpcstack 0 -> kmem_log_enter 0 <- kmem_log_enter 0 <- kmem_cache_alloc_debug 0 <- kmem_cache_alloc 0 <- kmem_zalloc 0 <- gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_alloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_xalloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> segkmem_alloc 0 -> segkmem_xalloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_seg_alloc 0 -> highbit 0 <- highbit 0 -> highbit 0 <- highbit 0 -> vmem_seg_create ... |