Um Oops-Meldungen und Exception-Reports auf einem Rechner persistent zu halten, sind mehrere Verfahren verfügbar:
Für den Zugriff auf die Einträge und die dabei zu benutzenden Techniken sind entsprechend viele Möglichkeiten denkbar. Im nachfolgenden ist die Konfiguration und Handhabung der einzelnen Verfahren näher beschrieben.
Dieses Verfahren entspricht den für Windows-Anwendungen verfügbaren Standards. Wenn die Einstellung WarnLevel ungleich 0 ist, und keine Logdatei angegeben wurde, werden die Meldungen in das Windows Eventlog eingetragen.
Über die Computerverwaltung können die Einträge angesehen werden, bei entsprechender Berechtigung auch Eventlogs anderer Rechner.
Dort werden auch Filtermöglichkeiten geboten, mit denen die Meldung bspw. auf einen bestimmten Zeitraum eingeschränkt werden können.
Wenn neben einem WarnLevel größer als 0 eine Logdatei eingetragen wird, werden Ereignisse nur noch dann in das Eventlog geschrieben, wenn aus irgendeinem Grund die Einträge in keine der angegebenen Logdateien geschrieben werden konnten.
Wenn die TAA Infrastruktur erkennt, dass die Meldungen in eine Datei eingetragen werden müssen, die die Endung .htm oder .html trägt, so werden die Einträge als HTML-Tabellenzeilen am Ende der Datei angehängt. Da klassisches HTML nicht auf abschließenden Tags besteht, genügt es, eine Datei mit einem Header als Logdatei anzulegen, wobei der Header schlussendlich mit einer <table>-Anweisung aufhört. Die fehlenden Elemente </table>, </body> und </html> werden vom Browser angenommen.
Die einzelnen Spalten der Meldungen werden mit Klassen versehen, wodurch die Möglichkeit besteht, mit style
-Angaben die Formatierung im Header oder ausgelagert zu bestimmen. Die von der TAA-Infrastruktur erzeugten HTML-Elemente beinhalten ausser den Klassenangaben keine Formatierungen.
Wenn bei einer Meldung ein Stacktrace
produziert wurde, wird von der TAA Infrastruktur hierzu eine zusätzliche Zeile eingefügt, die sämtliche Spalten der Meldungszeile umfasst. Diese Zeile enthält auch eine eigene Klassenangabe, und wird zusätzlich als vorformatiert (<pre>) gekennzeichnet.
Ausschnitt aus einem HTML-Oopslog:
<TR> <TD class="ts">2001-11-05-19.45.59.149750</TD> <TD class="pid">0000081c</TD> <TD class="src">D:\work\dll32\trt\ctrngen.c</TD> <TD class="line">604</TD> <TD class="code">1073752086</TD> <TD class="msg">BC-Document 'HG-TEST-BUDDYCTV/BuddyCTV/1' was shreddered without having been print.</TD> <TD class="bcid"> [0x05319CB8 (TAA.taaStart)]</TD> </TR> <TR> <TD class="ts">2001-11-05-19.46.00.899750</TD> <TD class="pid">0000081c</TD> <TD class="src">D:\work\dll32\trt\taasrv.c</TD> <TD class="line">1336</TD> <TD class="code">1073752049</TD> <TD class="msg">This process has been debugged. If the debugger is Microfocus Anim2Wg, an inadvertent stop may have occured.</TD> <TD class="bcid"> [Unknown]</TD> </TR> <TR> <TD class="exception" colspan="7"><PRE> Exception code: 00010002 Debugger wurde fortgesetzt. Fault address: 77E7F142 01:0000E142 C:\WINNT\system32\KERNEL32.DLL Registers: EAX:0012F164 EBX:7FFDF000 ECX:0012F540 EDX:00006174 ESI:00000000 EDI:0012F750 CS:EIP:001B:77E7F142 SS:ESP:0023:0012F15C EBP:0012F1B4 DS:0023 ES:0023 FS:0038 GS:0000 Flags:00000246 Call stack: Address Frame Logical addr Module 77E7F142 0012F1B4 0001:0000E142 C:\WINNT\system32\KERNEL32.DLL 6E3F57CD 0012F768 0001:000647CD D:\work\dll32\trt\debug32\t2TRT609.dll 6E3F611F 0012FBCC 0001:0006511F D:\work\dll32\trt\debug32\t2TRT609.dll 6E3C372D 0012FC44 0001:0003272D D:\work\dll32\trt\debug32\t2TRT609.dll 6E3C9BAB 0012FCBC 0001:00038BAB D:\work\dll32\trt\debug32\t2TRT609.dll 6E3CE9E0 0012FD64 0001:0003D9E0 D:\work\dll32\trt\debug32\t2TRT609.dll 6E3CE303 0012FDC0 0001:0003D303 D:\work\dll32\trt\debug32\t2TRT609.dll 6E3D0A62 0012FE9C 0001:0003FA62 D:\work\dll32\trt\debug32\t2TRT609.dll 004010C3 0012FF20 0001:000000C3 D:\work\exe32\taastart\debug32\taa32go.exe 00401383 0012FFC0 0001:00000383 D:\work\exe32\taastart\debug32\taa32go.exe 77E87D08 0012FFF0 0001:00016D08 C:\WINNT\system32\KERNEL32.DLL </PRE></TD> </TR> <TR> <TD class="ts">2001-11-05-19.46.33.759750</TD> <TD class="pid">0000081c</TD> <TD class="src">D:\work\dll32\trt\taaimstk.c</TD> <TD class="line">3200</TD> <TD class="code">1073751887</TD> <TD class="msg">Assignment for formal parameter 'HGTESTP' missing; now assigned to dummy local object.</TD> <TD class="bcid"> [0x053AF040 (TAA.taaStart)]</TD> </TR>
Die Zeilenumbrüche im obigen Beispiel sind zum Zwecke der Lesbarkeit eingefügt. Mit folgendem Header ließen sich die Daten beispielsweise formatieren:
<STYLE type="text/css"> body li p { font-family: Verdana, Arial, Helvetica; font-style: normal; font-weight: normal; font-size: 10pt; color: black; } td { font-family: Verdana, Arial, Helvetica; font-style: normal; font-weight: normal; font-size: 10pt; color: black; vertical-align: top; } .ts { font-family: Courier New, Courier; font-style: normal; font-weight: normal; font-size: 8pt; color: black; background-color: #AACCEE; width: 185; } .src { font-size: 0pt; visibility: hidden; width: 0%; } .line { font-size: 0pt; visibility: hidden; width: 0%; } .bcid { font-size: 0pt; visibility: hidden; width: 0%; } .code { font-size: 0pt; visibility: hidden; width: 0%; } .msg { font-family: Verdana, Arial, Helvetica; font-style: normal; font-weight: normal; font-size: 10pt; color: blue; } .pid { font-size: 0pt; visibility: hidden; width: 0%; } .exception { font-family: Courier New, Courier; font-style: normal; font-weight: normal; font-size: 8pt; color: red; background-color: #AAAAAA; } </style> <table width="100%" cellspacing="0" cellpadding="0">
Das Ergebnis würde dabei wie folgt aussehen:
Der Zugriff auf Protokolldateien von anderen Rechnern ist über entsprechende Freigaben oder über Intranet oder Internet möglich.
Wenn die TAA Infrastruktur erkennt, dass die Meldungen in eine Datei eingetragen werden müssen, und diese Datei die Endung .xml trägt, so werden die Einträge als XML-Elemente in der Datei eingefügt. Dazu wird die bestehende Datei vom Ende an rückwärts nach dem letzten abschließendem XML-Element durchsucht. Vor diesem Schlusstag werden die weiteren Protokolleinträge eingefügt.
Auch bei dieser Lösung ist der Zugriff auf Protokolldateien von anderen Rechnern über entsprechende Freigaben oder über Intranet oder Internet möglich.
Ausschnitt aus einem XML-OOpslog:
<OOPSE> <OOPS> <TS>2001-11-05-19.49.01.868750</TS> <PID>00001732</PID> <FROM> <SRC>D:\work\dll32\trt\taasrv.c</SRC> <LINE>1336</LINE> </FROM> <CODE>1073752049></CODE> <MSG>This process has been debugged. If the debugger is Microfocus Anim2Wg, an inadvertent stop may have occured.</MSG> <BC>[Unknown]</BC> <EXCEPTION> <![CDATA[ Exception code: 00010002 Debugger wurde fortgesetzt. Fault address: 77E7F142 01:0000E142 C:\WINNT\system32\KERNEL32.DLL Registers: EAX:0012F164 EBX:7FFDF000 ECX:0012F540 EDX:00006174 ESI:00000000 EDI:0012F750 CS:EIP:001B:77E7F142 SS:ESP:0023:0012F15C EBP:0012F1B4 DS:0023 ES:0023 FS:0038 GS:0000 Flags:00000246 Call stack: Address Frame Logical addr Module 77E7F142 0012F1B4 0001:0000E142 C:\WINNT\system32\KERNEL32.DLL 6E3F57CD 0012F768 0001:000647CD D:\work\dll32\trt\debug32\t2TRT609.dll 6E3F611F 0012FBCC 0001:0006511F D:\work\dll32\trt\debug32\t2TRT609.dll 6E3C372D 0012FC44 0001:0003272D D:\work\dll32\trt\debug32\t2TRT609.dll 6E3C9BAB 0012FCBC 0001:00038BAB D:\work\dll32\trt\debug32\t2TRT609.dll 6E3CE9E0 0012FD64 0001:0003D9E0 D:\work\dll32\trt\debug32\t2TRT609.dll 6E3CE303 0012FDC0 0001:0003D303 D:\work\dll32\trt\debug32\t2TRT609.dll 6E3D0A62 0012FE9C 0001:0003FA62 D:\work\dll32\trt\debug32\t2TRT609.dll 004010C3 0012FF20 0001:000000C3 D:\work\exe32\taastart\debug32\taa32go.exe 00401383 0012FFC0 0001:00000383 D:\work\exe32\taastart\debug32\taa32go.exe 77E87D08 0012FFF0 0001:00016D08 C:\WINNT\system32\KERNEL32.DLL ]]> </EXCEPTION> </OOPS> <OOPS> <TS>2001-11-05-21.28.21.866536</TS> <PID>00002116</PID> <FROM> <SRC>D:\work\dll32\trt\taaimstk.c</SRC> <LINE>3200</LINE> </FROM> <CODE>1073751887</CODE> <MSG>Assignment for formal parameter 'HGTESTP' missing; now assigned to dummy local object.</MSG> <BC>[0x05319CD8 (TAA.taaStart)]</BC> </OOPS> </OOPSE>
Die Zeilenumbrüche im obigen Beispiel sind zum Zwecke der Lesbarkeit eingefügt. Mit folgendem HTML ließe sich das XML Log beispielsweise formatieren:
<HTML> <HEAD></HEAD> <TITLE>TAA Messages on Cavenaugh</TITLE> <STYLE type="text/css"> <!-- body li td { font-family: Verdana, Arial, Helvetica; font-style: normal; font-weight: normal; font-size: 10pt; color: black; } .ts { font-family: Courier New, Courier; font-style: normal; font-weight: normal; font-size: 8pt; color: black; background-color: #AACCEE; width: 185; } .msg { font-family: Verdana, Arial, Helvetica; font-style: normal; font-weight: normal; font-size: 10pt; color: blue; } .exception { font-family: Courier New, Courier; font-style: normal; font-weight: normal; font-size: 8pt; color: red; background-color: #AAAAAA; } --> </style> <BODY> <XML ID="oopses" SRC="c:\t\taaoops.xml"></XML> <TABLE width="100%" datasrc="#oopses" cellspacing="0" cellpadding="2"> <TR> <TD class="ts"><DIV datafld="TS"></DIV></TD> <TD class="msg"><DIV datafld="MSG"></DIV></TD> </TR> <TR> <TD class="exception" colspan="7"><DIV datafld="EXCEPTION"></DIV></TD> </TR> </table> </BODY> </HTML>
Falls eine Protokolldatei im CSV-Format gespeichert werden soll, werden pro Eintrag folgende Spalten geschrieben:
Die CSV-Datei erhält - wenn diese noch leer ist - einen Header. Die Einträge sind CSV-gerecht formatiert1), damit diese direkt bspw. in Excel oder per ODBC-CSV weiter verarbeitet werden können.
Wenn die TAA Infrastruktur erkennt, dass die Meldungen in einer Datei eingetragen werden müssen, und diese Datei durch seinen Suffix weder als XML noch als HTML gekennzeichnet ist, so werden die Einträge als Textzeilen am Ende der Datei angefügt.
Der Zugriff auf Protokolldateien von anderen Rechnern ist über entsprechende Freigaben und Berechtigungen möglich.
Ausschnitt aus einem Oopslog:
[2001-11-07-09.44.59.886737] 00002636: D:\work\dll32\trt\ctrngen.c(604): message I40002816: BC-Document 'HG-TEST-BUDDYCTV/BuddyCTV/1' was shreddered without having been print. [0x084C93F8 (TAA.taaStart)] [2001-11-07-09.45.01.573737] 00002636: D:\work\dll32\trt\taasrv.c(1336): message I400027f1: This process has been debugged. If the debugger is Microfocus Anim2Wg, an inadvertent stop may have occured. [Unknown] Exception code: 00010002 Debugger wurde fortgesetzt. Fault address: 77E7F142 01:0000E142 C:\WINNT\system32\KERNEL32.DLL Registers: EAX:0012F150 EBX:7FFDF000 ECX:0012F540 EDX:00006174 ESI:00000000 EDI:0012F750 CS:EIP:001B:77E7F142 SS:ESP:0023:0012F148 EBP:0012F1A0 DS:0023 ES:0023 FS:0038 GS:0000 Flags:00000246 Call stack: Address Frame Logical addr Module 77E7F142 0012F1A0 0001:0000E142 C:\WINNT\system32\KERNEL32.DLL 6E3F57CD 0012F768 0001:000647CD D:\work\dll32\trt\debug32\t2TRT609.dll 6E3F62EF 0012FBCC 0001:000652EF D:\work\dll32\trt\debug32\t2TRT609.dll 6E3C372D 0012FC44 0001:0003272D D:\work\dll32\trt\debug32\t2TRT609.dll 6E3C9BAB 0012FCBC 0001:00038BAB D:\work\dll32\trt\debug32\t2TRT609.dll 6E3CE9E0 0012FD64 0001:0003D9E0 D:\work\dll32\trt\debug32\t2TRT609.dll 6E3CE303 0012FDC0 0001:0003D303 D:\work\dll32\trt\debug32\t2TRT609.dll 6E3D0A62 0012FE9C 0001:0003FA62 D:\work\dll32\trt\debug32\t2TRT609.dll 004010C3 0012FF20 0001:000000C3 D:\work\exe32\taastart\debug32\taa32go.exe 00401383 0012FFC0 0001:00000383 D:\work\exe32\taastart\debug32\taa32go.exe 77E87D08 0012FFF0 0001:00016D08 C:\WINNT\system32\KERNEL32.DLL[2001-11-07-09.45.39.042737] 00002600: D:\work\dll32\trt\taaimstk.c(3200): message I4000274f: Assignment for formal parameter 'HGTESTP' missing; now assigned to dummy local object. [0x085277C0 (TAA.taaStart)]
Die Infrastruktur bietet die Möglichkeit, für einzelne Meldungen einen Stacktrace bzw. Minidumps zu produzieren, damit das Entwicklerteam die genauen Umständen, die zu der Meldung geführt haben, auswerten kann.
Dazu werden in der Registry die Einstellungen StacktraceFor
, MiniDumpFor
und MiniDumpOnce
2) ausgewertet. Diese bestehen aus einer durch Semikolon getrennte Liste von Meldungen, für die ein Stacktrace
bzw. Minidump
produziert werden soll. Die Meldung wird durch den Dateinamen und die Zeilennummer identifiziert. Für das oben verwendete Beispiel müsste der Eintrag den Wert taasrv.c:1336;
enthalten. Achten Sie hierbei auf das abschließende Semikolon. Der Stacktrace bzw. Minidump werden für jedes auftreten der Meldung erzeugt. Für ein Eintrag welche in MiniDumpOnce
enthalten ist, wird der Minidump nur einmal für ein Prozess erzeugt.
Es können auch Minidumps für Conditions erstellt werden. Dazu muss der Name und Code der Condition eingetragen werden (z.B. ZZTAAOM1:7;
). Für jedes auftreten der Cndition werden dann 2 Minidumps erstellt, eine mit dem Suffix _set
zum Zeitpunkt wo die Condition angelegt wird und eine mit der Suffix _raise
zum Zeitpunkt wo die Condition aufgeworfen wird.
Einstellung | Format | Inhalt | Default |
---|---|---|---|
Software\TAA\Config\Warnlevel | Dword | 0: keine Protokollierung 1: Protokolleinträge 2: interaktive Meldung und Einträge | 2 |
Software\TAA\Config\Logfile | Zeichenfolge | Pfad zu Logdatei. | leer |
Software\TAA\Config\StacktraceFor | Zeichenfolge | Durch Semikolon getrennte Liste von Meldungen und oder Conditions, zu denen zusätzliche Informationen ausgegoben werden. | leer |
Software\TAA\Config\MiniDumpFor | Zeichenfolge | Durch Semikolon getrennte List von Meldungen und oder Conditions, zu denen ein MiniDump erstellt werden soll. | leer |
Software\TAA\Config\MiniDumpDir | Zeichenfolge | Verzeichnis für MiniDumps. Falls nicht angegeben, wird das Temp-Verzeichnis für MiniDumps verwendet. | Temp-Verzeichnis |
Software\TAA\Config\MaxMiniDumps3) | Zahl | Maximale Anzahl Dump Dateien. Gibt die Maximalanzahl an Dump Datein an die geschrieben werden. | 20 |
Software\TAA\Config\MiniDumpOnce | Zeichenfolge | Durch Semikolon getrennte List von Meldungen und oder Conditions, zu denen einmal ein MiniDump pro Prozess erstellt werden soll. | leer |
Software\TAA\Config\MiniDumpOnException | Bool | Wenn dieser Eintrag einen Wert != 0 hat, wird wenn die Infrastruktur eine Exception abfängt, auch versucht einen MiniDump zu erstellen. Der Name der Mindump wird am Ende der Application Trapped-Oopsmeldung mit ausgegeben:[2017-11-15-09.10.04.397000] taaimcal.cpp(1717): Application exception (trapped by TAA). Exception code: C0000005 ACCESS_VIOLATION Fault address: 7176B105 01:005BA105 D:\TAA\TAARDI\TeamWiSE.RuntimeCore.dll <snip>....</snip> MiniDump saved with id {D8CE05EF-1F75-4167-991B-DB109CD5D925} <snip>....</snip> | 0 |
Software\TAA\Config\MiniDumpAll | Zeichenfolge | Durch Semikolon getrennte List von Meldungen und oder Conditions, zu denen ein MiniDump erstellt werden soll. Achtung: In Gegensatz zu MiniDumpFor und MiniDumpOnce werden MiniDumps für alle bekannte TAA Prozesse erzeugt. | leer |