combit List & Label 29 - .NET Hilfe
Einführung in die Programmierung / Weitere wichtige Konzepte / Debugging
In diesem Thema
    Debugging
    In diesem Thema

    Probleme die auf dem Entwicklerrechner auftreten können meist leicht gefunden werden – hier kann direkt mit den üblichen Features der Entwicklungsumgebung gearbeitet werden und ein Problem so recht schnell eingegrenzt werden. Der erste Schritt besteht darin, eventuell auftretende Exceptions abzufangen und deren Ursache zu überprüfen (siehe auch Fehlerhandling mit Exceptions).

    Als Entwicklungskomponente wird List & Label aber natürlich unter einer Vielzahl verschiedener Konstellationen bei den Anwendern ausgeführt. Um Probleme dort möglichst einfach zu finden, steht ein eigenes Debug-Tool zur Verfügung, das bei selten oder nur auf bestimmten Systemen auftretenden Problemen eine Protokollierungsfunktion bietet, mit deren Hilfe Probleme auch auf Systemen ohne Debugger untersucht werden können. Natürlich kann die Logging-Funktion auch auf dem Entwicklerrechner genutzt werden und bietet auch dort die Möglichkeit, sämtliche Aufrufe und Rückgabewerte schnell auf einen Blick zu prüfen.

     

    Protokolldatei anfertigen

    Tritt ein Problem nur auf einem Kundensystem auf, sollte auf diesem zunächst eine Protokolldatei erstellt werden. Hierzu dient das Tool Debwin, welches im Verzeichnis Verschiedenes der List & Label-Installation installiert wird. Debwin muss vor der Applikation gestartet werden. Über Capture List & Label Log wird die Protokollierung aktiviert. Wenn anschließend die Applikation gestartet wird, werden sämtliche Aufrufe an die Komponente mit ihren Rückgabewerten sowie einige Zusatzinformationen zu Modulversionen, Betriebssystem etc. protokolliert. Jede unter .NET geworfene Exception entspricht im Protokoll einem negativen Rückgabewert einer Funktion. Im Protokoll finden sich meist weitere hilfreiche Informationen, eine typische Ausgabe könnte wie folgt aussehen:

    ...

    INFO  cmLL29 LL.API 3468 14:41:30.233 >LlSelectFileDlgTitleEx(2,000A1938,'Designer',0x00008001,145F9638='''',16384,00000000)
    INFO  cmLL29 LL.API 3468 14:41:31.563 <LlSelectFileDlgTitleEx() -> -99 (FFFFFF9D) (The user has terminated the operation.)
    INFO  cmLL29 LL.API 3468 14:41:31.564 >LlGetErrortext(-99,14580D10,16384)
    INFO  cmLL29 LL.API 3468 14:41:31.564 <LlGetErrortext() -> 0 (00000000) ['The user has terminated the operation.']
    ERROR cmLL29 LL.NetFX 3468 14:41:31.584 ERR: Caught LL_User_Aborted_Exception (The user has terminated the operation.).
    ERROR cmLL29 LL.NetFX 3468 14:41:31.584 ERR:  Inner Exception:  ()
    ERROR cmLL29 LL.NetFX 3468 14:41:31.584 ERR:  Stack Trace:
    ERROR cmLL29 LL.NetFX 3468 14:41:31.584 ERR:     at combit.Reporting.LLException.CheckReturn(Int32 returnValue)
    ERROR cmLL29 LL.NetFX 3468 14:41:31.584 ERR:    at combit.Reporting.LlCore.LlSelectFileDlgTitleEx(IntPtr windowHandle, String title, LlProject projectType, String& projectFile)
    ERROR cmLL29 LL.NetFX 3468 14:41:31.584 ERR:    at combit.Reporting.ListLabel.DesignLabelFromRelationalDataSource(IDataProvider dataSource, String designerTitle, LlProject projectType, String projectFile, Boolean showFileSelect)
    ERROR cmLL29 LL.NetFX 3468 14:41:31.584 ERR:    at combit.Reporting.ListLabel.AutoDesign(String designerTitle, LlProject projectType, String projectFile, Boolean showFileSelect)

    ...

    Man sieht zunächst die Art der Ausgabe gefolgt von der DLL, die die Ausgabe erzeugt hat. Dann kommt der Ort innerhalb von List & Label, die Thread-ID und eine Timestamp für die Ausgabe sowie den eigentlichen Aufruf mit allen Parametern. In der Folgezeile erfolgt dann die Rückgabe eines Fehlercodes (-99) und eine Erklärung dafür – in diesem Falle hat der Benutzer den Dateiauswahldialog mit "Abbrechen" beendet.

     

    Protokollierung im Code

    Soll die Anwendung ohne Hilfe des Tools Debwin Debug-Protokolle erstellen, kann dies durch die Aktivierung des Debuggings in der Komponente erreicht werden. Dafür ist es lediglich erforderlich die beiden Eigenschaften Debug und DebugLogFilePath entsprechend zu definieren.

    using combit.Reporting;
    ...
    using(ListLabel LL = new ListLabel())
    {
      LL.Debug = LlDebug.Enabled | LlDebug.LogToFile;
      LL.DebugLogFilePath = @"c:\temp\myLLProtocol.log";                                 
    }
    
    Imports combit.Reporting
    ...
    Using LL As New ListLabel
    
        LL.Debug = LlDebug.Enabled | LlDebug.LogToFile
        LL.DebugLogFilePath = "c:\temp\myLLProtocol.log"
    
    End Using
    

     

    Steuern Sie diese beiden Debug-Eigenschaften doch einfach mit Hilfe der AppConfig und lesen Sie die gewünschten Eigenschaften aus der AppConfig-Datei der eigenen Anwendung aus, um sie zur Laufzeit setzen zu können. So kann die Debug-Protokollierung für eine Anwendung einfach vor Ort beim Kunden konfiguriert werden, ohne dass erst die Anwendung neu erstellt und ausgeliefert werden muss - eine Anpassung in der AppConfig ist ausreichend.