debug_info() ============ DEPRECATED ---------- :: SYNOPSIS -------- :: #include mixed debug_info(int flag) mixed debug_info(int flag, mixed arg) mixed debug_info(int flag, mixed arg2, mixed arg3) BESCHREIBUNG ------------ :: Sammelt entsprechend den Angaben in gewisse intere Debuginfos des Treibers. kann dabei folgende in debug_info.h definierte Werte enthalten: DINFO_OBJECT (0): Angezeigt werden Informationen zum in spezifizierten Objekt, zum Beispiel heart_beat, enable_commands etc. Die Funktion liefert 0 zurueck. DINFO_MEMORY (1): Angezeigt werden Informationen zu Speicherbelegung und -ausnutzung des in spezifizierten Objekts, zum Beispiel Anzahl Strings, Variablen, geerbte Files, Objektgroesse etc. Die Funktion liefert 0 zurueck. DINFO_OBJLIST (2): debug_info() liefert Objekte aus der globalen Objektliste. Wenn nicht angegeben wird, wird das erste Element aus der Objektliste gelierfert, wenn eine Zahl n ist, das n-te Element. Ist ein Objekt, werden die nachfolgenden Objekte in der Objektliste zurueck geliefert. Das optionale Argument bezeichnet die Anzahl zurueck gelieferter Objekte. Wenn 0 ist, wird ein einzelnes Objekt zurueck geliefert. Wenn eine Zahl m enthaelt, wird ein Array mit hoechstens m Elementen zurueck geliefert. Auf diese Weise kann ein Array mit saemtlichen Objekten im Spiel erzeugt werden, wenn fuer __INT_MAX__ gesetzt wird (eine entsprechende maximale Arraygroesse vorausgesetzt). DINFO_MALLOC (3): Entsprichend der Eingabe des 'malloc'-Kommandos. Es muessen keine weiteren Argumente angegeben werden. DINFO_STATUS (4): Angezeigt wird die Statusinformation des Drivers. Optional kann das Argument die Werte 0, "tables", "swap", "malloc" oder andere vom Driver akzeptierte Argumente enthalten. Das Resultat ist ein druckbarer String, der die Statusinformation enthaelt, oder 0, wenn ein ungueltiges Argument angegeben wurde. DINFO_DUMP (5): Die durch angeforderte Information wird in ein File geschrieben, das man mit angeben kann. Wird nicht angegeben, wird eine Standarddatei verwendet. debug_info() ueberprueft mittels master->valid_write(), ob es das File schreiben kann. Falls bereits eine entsprechende Datei existiert, wird diese ueberschrieben. Die Funktion liefert 1 bei Erfolg, 0 sonst. == "objects": liefert Informationen ueber alle Objekte im Spiel und schreibt diese standardmaessig in die Datei /OBJ_DUMP, dem valid_write() wird 'objdump' uebergeben. Die Datei enthaelt fuer jedes Objekt eine Zeile, in der jeweils folgende Informationen aufgelistet sind: - Name des Objekts (object_name) - Groesse im Speicher, gemeinsamer genutzter Speicher nur einmal gezaehlt - Groesse im Speicher, wenn es keine gemeinsam genutzte Daten geben wuerde - Anzahl Referenzen - 'HB', wenn das Objekt einen heart_beat hat, sonst nichts. - der Name der Umgebung oder '--', wenn das Objekt keine Umgebung hat - in Klammern die Anzahl der durch das Objekt verursachten Verarbeitungsschritten (execution ticks) - der Swap-Status: > nichts, wenn das Objekt nicht geswapt wurde > 'PROG SWAPPED', wenn nur das Programm geswapt wurde > 'VAR SWAPPED', wenn nur die Variablen geswapt wurden > 'SWAPPED', wenn beide geswapt wurden - die Zeit, zu der das Objekt geladen wurde. == "destructed": liefert Informationen ueber alle zerstoerten Objekte und schreibt diese standardmaessig in die Datei /DEST_OBJ_DUMP, dem valid_write() wird 'objdump' uebergeben. Die Datei enthaelt fuer jedes Objekt eine Zeile, in der jeweils folgende Informationen aufgelistet sind: - Name des Objekts (object_name) - Anzahl der Referenzen - 'NEW', wenn das Objekt in diesem Verarbeitungszyklus zerstoert wurde, nichts wenn es bereits fruehre zerstoert worden war. == "opcodes": liefert Nutzungsinformationen ueber die opcodes. Standardmaessig wird in die Datei /OPC_DUMP geschrieben. valid_write() wird 'opcdump' uebergeben. == "memory": liefert eine Liste aller allokierten Speicherbloecke. Standardmaessig wird in die Datei /MEMORY_DUMP geschrieben; valid_write() wird 'memdump' uebergeben. Existiert die Datei bereits, werden die neuen Daten angehaengt. Wenn der Allokator einen Speicherabzug nicht unterstuetzt, wird keine Datei geschrieben und immer 0 zurueckgegeben. Diese Funktion ist am nuetzlichsten wenn der Allokator mit MALLOC_TRACE und MALLOC_LPC_TRACE kompiliert wurde. DINFO_DATA (6): Liefert Rohdaten ueber gewisse, durch spezifizierte Aspekte des Treibers. Das Resultat der Funktion ist ein Array mit der Information oder 0, falls keinen gueltigen Wert enthalten hat. Ist eine Zahl, die kleiner ist als die Anzahl Elemente im Resultat-Array, liefert die Funktion nur das entsprechende Element zurueck. Zulaessige Werte fuer sind: DID_STATUS, DID_SWAP und DID_MALLOC. == DID_STATUS (0): Liefert die "status" und "status table" Information. Folgende Indizes sind definiert: - int DID_ST_BOOT_TIME die Zeit (time()), zu der das Mud gestartet wurde - int DID_ST_ACTIONS - int DID_ST_ACTIONS_SIZE die Anzahl und Groesse im Speicher der allozierten Actions. - int DID_ST_SHADOWS - int DID_ST_SHADOWS_SIZE Anzahl und Groesse im Speicher aller allozierten Shadows. - int DID_ST_OBJECTS - int DID_ST_OBJECTS_SIZE Anzahl und Groesse im Speicher aller Objekte. - int DID_ST_OBJECTS_SWAPPED - int DID_ST_OBJECTS_SWAP_SIZE Anzahl und Groesse im Speicher der geswapten Variablenbloecke der Objekte - int DID_ST_OBJECTS_LIST Anzahl Objekte in der Objektliste - int DID_ST_OBJECTS_NEWLY_DEST Anzahl der frisch zerstoerten Objekte (d.h. Objekte, die in diesem Verarbeitungszyklus zerstoert wurden) - int DID_ST_OBJECTS_DESTRUCTED Anzahl der zerstoerten, aber noch immer referenzierten Objekte, ohne die unter DID_ST_OBJECTS_NEWLY_DEST bereits gezaehlten. - int DID_ST_OBJECTS_PROCESSED Anzahl der gelisteten Objekte, die im letzten Verarbeitungszyklus verarbeitet wurden. - float DID_ST_OBJECTS_AVG_PROC Durchschnittlicher Anteil der pro Zyklus verarbeiteten Objekte, ausgedrueckt in Prozent (0 .. 1.0) - int DID_ST_OTABLE Anzahl eingetragener Objekte in der Objekttabelle - int DID_ST_OTABLE_SLOTS Anzahl von Hashplaetzen, die von jeder Objekttabelle bereitgestellt werden - int DID_ST_OTABLE_SIZE Durch die Objekttabelle belegter Speicher - int DID_ST_HBEAT_OBJS Anzahl Objekte mit einem heart_beat() - int DID_ST_HBEAT_CALLS Anzahl aktiver heart_beat() Zyklen bisher (d.h. Zyklen, in denen mindestens eine heart_beat() Funktion aufgerufen wurde) - int DID_ST_HBEAT_CALLS_TOTAL Gesamtzahl von heart_beat() Zyklen bisher. - int DID_ST_HBEAT_SLOTS - int DID_ST_HBEAT_SIZE Anzahl und Groesse aller allozierten Eintraege in der heart_beat() Tabelle. - int DID_ST_HBEAT_PROCESSED Anzahl heart_beat()s im letzten Zyklus - float DID_ST_HBEAT_AVG_PROC Durchschnittlicher Anteil der pro Zyklus aufgerufenen heart_beat()s, ausgedrueckt in Prozent (0 .. 1.0) - int DID_ST_CALLOUTS Anzahl und Groesse aller laufenden call_out()s - int DID_ST_ARRAYS - int DID_ST_ARRAYS_SIZE Anzahl und Groesse aller Arrays - int DID_ST_MAPPINGS - int DID_ST_MAPPINGS_SIZE Anzahl und Groesse aller Mappings - int DID_ST_PROGS - int DID_ST_PROGS_SIZE Anzahl und Groesse aller Programme - int DID_ST_PROGS_SWAPPED - int DID_ST_PROGS_SWAP_SIZE Anzahl und Groesse der geswapten Programme - int DID_ST_USER_RESERVE - int DID_ST_MASTER_RESERVE - int DID_ST_SYSTEM_RESERVE Momentane Groesse der drei Speicherreserven - int DID_ST_ADD_MESSAGE - int DID_ST_PACKETS - int DID_ST_PACKET_SIZE Anzahl Aufrufe von add_message(), Anzahl und Groesse der versendeten Pakete. Wenn der Driver nicht mit COMM_STAT kompiliert wurde, liefern alle drei Werte immer -1 zurueck. - int DID_ST_APPLY - int DID_ST_APPLY_HITS Anzahl Aufrufen von apply_low(), und wie viele davon Cache-Treffer waren. Wenn der Driver nicht mit APPLY_CACHE_STAT kompiliert wurde, liefern beide Werte immer -1. - int DID_ST_STRINGS - int DID_ST_STRING_SIZE Anzahl unterschiedlicher Strings in der Stringtabelle, sowie ihre Groesse - int DID_ST_STR_TABLE_SIZE Groesse der String Tabelle - int DID_ST_STR_REQ - int DID_ST_STR_REQ_SIZE Gesamte Anzahl von String Allokationen, und ihre Groesse - int DID_ST_STR_SEARCHES - int DID_ST_STR_SEARCH_LEN Anzahl Suchvorgaenge in der Stringtabelle und die Gesamtlaenge des Suchstrings - int DID_ST_STR_FOUND Anzahl erfolgreicher Suchvorgaenge - int DID_ST_STR_ENTRIES Anzahl Eintraege (Hash Ketten) in der String Tabelle - int DID_ST_STR_ADDED Anzahl zur String Tabelle bisher hinzugefuegter Strings - int DID_ST_STR_DELETED Anzahl aus der String Tabelle bisher geloeschter Strings - int DID_ST_STR_COLLISIONS Anzahl zu einer existierenden Hash Kette hinzugefuegte Strings - int DID_ST_RX_CACHED Anzahl gecacheter regulaerer Ausdruecke (regular expressions) - int DID_ST_RX_TABLE - int DID_ST_RX_TABLE_SIZE Anzahl Plaetze in der Regexp Cache Tabelle und Speicherbedarf der gecacheten Ausdruecke - int DID_ST_RX_REQUESTS Anzahl Anfragen fuer neue regexps - int DID_ST_RX_REQ_FOUND Anzahl gefundener regexps in der regexp Cache Tabelle - int DID_ST_RX_REQ_COLL Anzahl angefragter regexps, die mit einer bestehenden regexp kollidierten - int DID_ST_MB_FILE Die Groesse des 'File' Speicherpuffers - int DID_ST_MB_SWAP Die Groesse des 'Swap' Speicherpuffers == DID_SWAP (1): Liefert "status swap"-Information: - int DID_SW_PROGS - int DID_SW_PROG_SIZE Anzahl und Groesse der geswappten Programmbloecke - int DID_SW_PROG_UNSWAPPED - int DID_SW_PROG_U_SIZE Anzahl und Groesse der nicht geswappten Bloecke - int DID_SW_VARS - int DID_SW_VAR_SIZE Anzahl und Groesse der geswappten Variablenbloecke - int DID_SW_FREE - int DID_SW_FREE_SIZE Anzahl und Groesse der freien Bloecke in der Auslagerungsdatei - int DID_SW_FILE_SIZE Groesse der Auslagerungsdatei - int DID_SW_REUSED Gesamter wiederverwendeter Speicherplatz in der Auslagerungsdatei - int DID_SW_SEARCHES - int DID_SW_SEARCH_LEN Anzahl und Gesamtlaenge der Suchvorgaenge nach wiederverwendbaren Bloecken in der Auslagerungsdatei - int DID_SW_F_SEARCHES - int DID_SW_F_SEARCH_LEN Anzahl und Gesamtlaenge der Suchvorgaenge nach einem Block, der frei gemacht werden kann. - int DID_SW_COMPACT TRUE wenn der Swapper im Compact-Modus laeuft - int DID_SW_RECYCLE_FREE TRUE wenn der Swapper gerade einen freien Block wiederverwendet == DID_MEMORY (2): Liefert die "status malloc"-Information: - string DID_MEM_NAME Der Name des Allokators: "sysmalloc", "smalloc", "slaballoc" - int DID_MEM_SBRK - int DID_MEM_SBRK_SIZE Anzahl und Groesse der Speicherbloecke, die vom Betriebssystem angefordert wurden (smalloc, slaballoc) - int DID_MEM_LARGE - int DID_MEM_LARGE_SIZE - int DID_MEM_LFREE - int DID_MEM_LFREE_SIZE Anzahl und Groesse der grossen allozierten bzw. freien Bloecke (smalloc, slaballoc) - int DID_MEM_LWASTED - int DID_MEM_LWASTED_SIZE Anzahl und Groesse der unbrauchbaren grossen Speicherfragmente (smalloc, slaballoc) - int DID_MEM_CHUNK - int DID_MEM_CHUNK_SIZE Anzahl und Groesse kleiner Speicherbloecke (chunk blocks; smalloc, slaballoc) - int DID_MEM_SMALL - int DID_MEM_SMALL_SIZE - int DID_MEM_SFREE - int DID_MEM_SFREE_SIZE Anzahl und groesse der allozierten bzw. freien kleinen Speicherbloecke (smalloc, slaballoc) - int DID_MEM_SWASTED - int DID_MEM_SWASTED_SIZE Anzahl und Groesse der unbrauchbar kleinen Speicherfragmente (smalloc, slaballoc) - int DID_MEM_MINC_CALLS - int DID_MEM_MINC_SUCCESS - int DID_MEM_MINC_SIZE Anzahl Aufrufe von malloc_increment(), Anzahl der erfolgreichen Aufrufe und die Groesse des auf diese Art allozierten Speichers (smalloc, slaballoc) - int DID_MEM_PERM - int DID_MEM_PERM_SIZE Anzahl und Groesse permanenter (non-GCable) Allokationen (smalloc, slaballoc) - int DID_MEM_CLIB - int DID_MEM_CLIB_SIZE Anzahl und Groesse der Allokationen durch Clib Funktionen (nur smalloc, slaballoc mit SBRK_OK) - int DID_MEM_OVERHEAD Overhead fuer jede Allokation (smalloc, slaballoc) - int DID_MEM_ALLOCATED Der Speicher, der durch die Speicherverwaltung alloziert wurde, inklusive den Overhead fuer die Speicherverwaltung (smalloc, slaballoc) - int DID_MEM_USED Der Speicher, der durch den Driver belegt ist, ohne den durch die Speicherverwaltung belegten Speicher (smalloc, slaballoc) - int DID_MEM_TOTAL_UNUSED Der Speicher, der vom System zur Verfuegung gestellt, aber vom Treiber nicht benoetigt wird. - int DID_MEM_AVL_NODES (smalloc, slaballoc) Anzahl der AVL-Knoten, die zur Verwaltung der freien grossen Speicherbloecke verwendet werden (nur smalloc). Dieser Wert kann in Zukunft wieder verschwinden. - mixed * DID_MEM_EXT_STATISTICS (smalloc, slaballoc) Detaillierte Statistiken des Allokators sofern diese aktiviert wurden; 0 anderenfalls. Dieser Wert kann in Zukunft wieder verschwinden. Das Array enthaelt NUM+2 Eintraege, wobei NUM Anzahl der verschiedenen 'kleinen' Blockgroessen ist. Eintrag [NUM] beschreibt die uebergrossen 'kleinen' Bloecke, Eintrag [NUM+1] beschreibt summarisch die 'grossen' Bloecke. Jeder Eintrag ist ein Array mit diesen Feldern: int DID_MEM_ES_MAX_ALLOC: Maximale Anzahl allokierter Bloecke dieser Groesse. int DID_MEM_ES_CUR_ALLOC: Derzeitige Anzahl allokierter Bloecke dieser Groesse. Current number of allocated blocks of this size. int DID_MEM_ES_MAX_FREE: Maximale Anzahl freier Bloecke dieser Groesse. int DID_MEM_ES_CUR_FREE: Derzeitige Anzahl freier Bloecke dieser Groesse. float DID_MEM_ES_AVG_XALLOC: Durchschnittliche Zahl von Allokationen pro Sekunde. float DID_MEM_ES_AVG_XFREE: Durchschnittliche Zahl von Deallokationen pro Sekunde. Die Durchschnittsstatistiken schliessen interne Umsortierungen der Blocklisten nicht ein. DINFO_TRACE (7): Liefert die 'trace' Information aus dem Call Stack entsprechend der Spezifikation in . Das Resultat ist entweder ein Array (dessen Format nachstehend erlaeutert ist) oder ein druckbarer String. Wird weggelasen entspricht dies DIT_CURRENT. == DIT_CURRENT (0): Momentaner Call Trace == DIT_ERROR (1): Letzter Fehler Trace (caught oder uncaught) == DIT_UNCAUGHT_ERROR (2): Letzer Fehler Trace, der nicht gefangen werden konnte (uncaught) Die Information wird in Form eines Array uebergeben. Die Fehlertraces werden nur geaendert, wenn ein entsprechender Fehler auftritt; ausserdem werden sie bei einem GC (Garbage Collection) geloescht. Nach einem Fehler, der nicht gefangen werden konnte (uncaught error), weisen beide Traces auf das gleiche Array, sodass der ==-Operator gilt. Wenn das Array mehr als ein Element enthaelt, ist das erste Element 0 oder der Name des Objekts, dessen heart_beat() den laufenden Zyklus begonnen hat; alle nachfolgenden Elemente bezeichnen den Call Stack, beginnen mit der hoechsten aufgerufenen Funktion. Alle Eintraege im Array sind wiederum Arrays mit folgenden Elementen: - int[TRACE_TYPE]: Der Typ der aufrufenden Funktion TRACE_TYPE_SYMBOL (0): ein Funktionssymbol (sollte nicht vorkommen) TRACE_TYPE_SEFUN (1): eine simul-efun TRACE_TYPE_EFUN (2): eine Efun Closure TRACE_TYPE_LAMBDA (3): eine lambda Closure TRACE_TYPE_LFUN (4): eine normale Lfun - int[TRACE_NAME] _TYPE_EFUN : entweder der Name der Funktion oder der Code einer Operator-Closure _TYPE_LAMBDA : die numerische Lambda-ID _TYPE_LFUN : der Name der Lfun - string[TRACE_PROGRAM]: Der Name des Programms mit dem Code - string[TRACE_OBJECT]: Der Name des Objekts, fuer das der Code ausgefuehrt wurde - int[TRACE_LOC]: _TYPE_LAMBDA : Der Offset des Programms seit Beginn des Closure-Codes _TYPE_LFUN : Die Zeilennummer. == DIT_STR_CURRENT (3): Liefert Informationen ueber den momentanen Call Trace als druckbarer String. == DIT_CURRENT_DEPTH (4): Liefert die Zahl der Frames auf dem Control Stack (Rekursionstiefe). DINFO_EVAL_NUMBER (8): gibt die Nummer der aktuellen Berechnung zurueck. Diese Nummer wird fuer jeden vom driver initiierten Aufruf von LPC-Code erhoeht, also bei Aufruf von: - Kommandos (die per add_action hinzugefuegt wurden) - heart_beat, reset, clean_up - Aufrufe durch call_out oder input_to - master applies, die auf externe Ereignisse zurueckgehen - driver hooks genauso - Rueckrufen von send_erq - logon in interaktiven Objekten Dieser Zaehler kann z.B. benutzt werden, um zu verhindern, dass bestimmte Aktionen mehrfach innerhalb eines heart_beat() ausgefuehrt werden. Eine andere Anwendungsmoeglichkeit sind Zeitstempel zur Sortierung zur Sortierung von Ereignissen. Es ist zu beachten, dass der Zaehler ueberlaufen kann, insbesondere auf 32-bit-Systemen. Er kann demzufolge auch negativ werden. GESCHICHTE ---------- :: Seit 3.2.7 liefert DINFO_STATUS die Information zurueck, anstatt sie nur auszugeben. DINFO_DUMP wurde in 3.2.7 eingefuehrt. LDMud 3.2.8 fuegte die Datengroesse des Objekts zum Resultat von DINFO_MEMORY hinzu, ausserdem die DINFO_DATA Abfrage und die verschiedenen DID_MEM_WASTED Statistiken. LDMud 3.2.9 fuegte DINFO_TRACE, das Indizierungs-Feature von DINFO_DATA, den 'destructed'-DINFO_DUMP, die DID_MEM_CLIB*, die DID_MEM_PERM*, ausserdem DID_ST_OBJECTS_NEWLY_DEST, DID_ST_OBJECTS_DEST, DID_MEM_OVERHEAD, DID_MEM_ALLOCATED, DID_MEM_USED, DID_MEM_TOTAL_UNUSED, DID_ST_HBEAT_CALLS_TOTAL und die found / added / collision Stringstatistiken. LDMud 3.2.10 fuegte die Erzeugungszeit zu DINFO_DUMP:"objects" hinzu, entfernte DID_MEM_UNUSED aus DINFO_DATA:DID_MEMORY, fuegte DINFO_DATA:DID_STATUS DID_ST_BOOT_TIME, DID_ST_MB_FILE und DID_ST_MB_SWAP hinzu und entfernte DID_ST_CALLOUT_SLOTS daraus, fuegte das dritte Argument zu DINFO_OBJLIST hinzu, und veraenderte die Bedeutung von DID_ST_CALLOUT_SIZE und DID_ST_HBEAT_SIZE bzw. _SLOTS. LDMud 3.3.533 fuegte DID_MEM_AVL_NODES zu DINFO_DATA:DID_MEMORY hinzu. LDMud 3.3.603 fuegte DID_MEM_EXT_STATISTICS zu DINFO_DATA:DID_MEMORY hinzu. LDMud 3.3.718 fuegte DIT_CURRENT_DEPTH to DINFO_TRACE hinzu. LDMud 3.3.719 fuegte DINFO_EVAL_NUMBER hinzu. SIEHE AUCH ---------- :: trace(E), traceprefix(E), malloc(D), status(D), dumpallobj(D)