Inhaltsverzeichnis

Oops- und Exception-Protokoll

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.

Protokollierung im Windows Eventlog

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.

Protokollierung in einer HTML-Datei

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.

Protokollierung in einer XML-Datei

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>

Protokollierung in einer CSV-Datei

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.

Protokollierung in einer Textdatei

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)]

Stacktrace & Minidump

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

Relevante Registry-Einstellungen

EinstellungFormatInhaltDefault
Software\TAA\Config\WarnlevelDword0: keine Protokollierung
1: Protokolleinträge
2: interaktive Meldung und Einträge
2
Software\TAA\Config\LogfileZeichenfolgePfad zu Logdatei. leer
Software\TAA\Config\StacktraceForZeichenfolgeDurch Semikolon getrennte Liste von Meldungen und oder Conditions, zu denen zusätzliche Informationen ausgegoben werden. leer
Software\TAA\Config\MiniDumpForZeichenfolgeDurch Semikolon getrennte List von Meldungen und oder Conditions, zu denen ein MiniDump erstellt werden soll. leer
Software\TAA\Config\MiniDumpDirZeichenfolgeVerzeichnis für MiniDumps. Falls nicht angegeben, wird das Temp-Verzeichnis für MiniDumps verwendet. Temp-Verzeichnis
Software\TAA\Config\MaxMiniDumps3)ZahlMaximale Anzahl Dump Dateien. Gibt die Maximalanzahl an Dump Datein an die geschrieben werden. 20
Software\TAA\Config\MiniDumpOnceZeichenfolgeDurch Semikolon getrennte List von Meldungen und oder Conditions, zu denen einmal ein MiniDump pro Prozess erstellt werden soll. leer
Software\TAA\Config\MiniDumpOnExceptionBoolWenn 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\MiniDumpAllZeichenfolgeDurch 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
1)
d.h. Werte, die den Listenbegrenzer enthalten, sind mit Anführungszeichen umklammert
2)
ab R9.02
3)
ab 10.00