GESCHUETZT
SYNOPSIS
        #include <trace.h>

        int trace(int traceflags)

BESCHREIBUNG
        Setzt die Trace Flags und liefert die alten Trace Flags zurueck.
        Wenn Tracing eingeschaltet ist, wird waehrend der Ausfuehrung eine
        Menge Informationen ausgegeben. Zu viel Output kann die Verbindung
        lahm legen oder sogar den ganzen Treiber zum Absturz bringen.

        Tracing erfolgt auf einer Pro-Verbindung-Basis: jeder interaktive (!)
        User kann sein eigenes Tracelevel und -praefix festlegen. Jeder
        erhaelt nur den Traceoutput fuer den Code, der waehrend der
        Auswertung eines vom User eingegeben Kommandos ausgefuehrt wird.

        Die Trace-Bits (aus <trace.h>) sind:

            TRACE_NOTHING       (  0): Beendet das Tracing
            TRACE_CALL          (  1): Tracet alle Aufrufe von Lfuns
            TRACE_CALL_OTHER    (  2): Tracet alle call_other() Aufrufe
            TRACE_RETURN        (  4): Tracet Resultate von Funktionen
            TRACE_ARGS          (  8): Gibt Argumente und Resultate von
                                       Funktionen aus
            TRACE_EXEC          ( 16): Tracet alle ausgefuehrten Anweisungen
            TRACE_HEART_BEAT    ( 32): Tracet den Heartbeat Code
            TRACE_APPLY         ( 64): Tracet Treiber-Applies
            TRACE_OBJNAME       (128): Gibt den Namen des Objektes aus

        TRACE_EXEC und TRACE_HEART_BEAT sollten nicht verwendet werden, weil
        sie massiven Output verursachen. TRACE_OBJNAME sollte nicht verwendet
        werden, wenn bekannt ist, welches Objekt getracet wird.

        Die Master-Lfun valid_trace() wird mit ("trace", traceflags)
        aufgerufen, um die Erlaubnis fuer die Nutzung von trace() zu erhalten.

BEISPIELE
        object obj;
        string prefix;
        obj = find_player("thomas");
        prefix = object_name(obj);  /* z.B. /std/player#69         */
        prefix = prefix[1..];       /* entfernt den fuehrenden "/" */
        traceprefix(prefix);
        /* Von hier an wird nur Code im Objekt std/player#69 getracet */
        trace(TRACE_CALL|TRACE_CALL_OTHER|TRACE_RETURN|TRACE_ARGS);
        ...
        trace(TRACE_NOTHING);

GESCHICHTE
        LDMud 3.2.9 uebergibt auch <traceflags> an valid_trace().

SIEHE AUCH
        traceprefix(E)
