Handbuch zur dynamischen Ablaufverfolgung in Solaris

Kapitel 36 Anonyme Ablaufverfolgung

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.

Anonyme Aktivierungen

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.

Fordern des anonymen Status

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.

Beispiele für die anonyme Ablaufverfolgung

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
  ...