Logging und Debugging verbinden

  • Hey,

    ich suche eine Möglichkeit, wie ich möglichst einfach ausgeben kann, was mein Skript grade tut. Also welche Funktion wurde aufgerufen (wenn möglich auch mit welchen Parametern), welche danach, etc...

    Gibt es da eine Möglichkeit?

    Ich arbeite immer mit endlos vielen ConsoleWrite und teilweise MsgBox'en, um zu verfolgen, ob Skripte das tun, was sie sollen und neben dem, dass das auch auskommentiert den Code schwerer lesbar macht, ist das recht aufwendig, das überall vorzusehen und es auch wieder auszukommentieren, wenn man den Fokus auf einen bestimmten Teil legen will.

    Am Besten wäre eine einfache Möglichkeit, das auch - sogar im kompilierten Skript - ausgeben lassen zu können.

    :thumbup:

  • Also generell kommt es viel darauf an was/wie du Programmierst. Also wie oft werden Funktionen aufgerufen etc.

    Machst du bei deinen Arbeitsschritten (wo es möglich ist) Prüfungen? Wenn ja kannst du diese auch mit loggen, wenn nein warum nicht?

    Generell kannst du eine Logdatei schreiben, in die du alles rein schreibst.

    Du könntest z.B. einen "Debug-Modus" per Ini oder so setzen, wenn der gesetzt ist, wird geloggt, sonst nicht oder du loggst generell um bei Programmabstürzen oder -fehlern immer eine Log-Datei zur Hand zu haben.

    Meine Empfehlungen:

    1. Dauerlogging betreiben
    2. Wenn du eine Funktion aufrufst, schreibt die Funktion als erstes z.B. "Function AB start" und als letztes "Function AB ende". Damit grenzt du einen Ausfall meistens schon mal auf eine Funktion ein.
    3. Alles was man prüfen kann, ob es erfolgreich war oder einen Fehler gab -Prüfen! Dieses dann loggen entweder egal ob Fehler oder nicht oder nur die Fehler mit dem Fehlerwerten (alle Werte die hierzu gehören!).
    4. Und ansonsten liegt es an dir was du mit loggst oder nicht, aber diese Stellen musst du schon selber einprogrammieren, ich wüsste aktuell keine Logik oder .au3 die sowas selber erkennt/erkennen könnte und halte das auch für unmöglich.

    Zuletzt stellt sich die Frage, wie du die Log-Datei handeln willst (beim Dauerlogging):

    - Nach jedem Programmstart wieder neu?

    - Ein Archiv über x Log-s?

    - Alles was älter ist als x-Tage löschen?

    - ...

    Einmal editiert, zuletzt von Moombas (28. Dezember 2018 um 13:05)

  • Hey Moombas, so habe ich mir das auch vorgestellt. Hatte nur die Hoffnung, dass man das vereinfachen kann... Ich schreibe doch recht kurze Funktionen zwecks Wiederverwendbarkeit und das verdoppelt ja fast die Zeilen des Codes (nicht ganz, aber du weißt schon).

    Wenn sich da keiner mit einer Erleuchtung in Richtung Automatik meldet, werde ich das wohl mal genauso starten, wie du es vorgeschlagen hast.

  • Wichtig dabei: Bedenke, je nachdem wie oft Funktionen aufgerufen werden etc. das deine Log-Datei immens groß werden wird!

    Ein wenig eingrenzen könntest du es nur, wenn du nur an den Stellen loggst, an denen Fehler auftreten (Siehe 3.).

    Dann kannst du das Error-Logging als Funktion schreiben, die du bei einem Fehler aufruft. Zu Übergebene Werte wären dann z.B.:

    1. Funktionsname + aktueller Arbeitsschritt
    2. dafür notwendige Parameter mit Namen
    3. das "falsche" Ergebnis
    4. @error (falls vorhanden)

    Vorteil: Kleinere Log-Datei mit weniger (scheinbarem) Datenmüll

    Nachteil: Bei einem Programmabsturz weist du nicht wo er war, da das Logging hier meist nicht mehr greifen kann.

    • Offizieller Beitrag

    Hey Moombas, so habe ich mir das auch vorgestellt. Hatte nur die Hoffnung, dass man das vereinfachen kann... Ich schreibe doch recht kurze Funktionen zwecks Wiederverwendbarkeit und das verdoppelt ja fast die Zeilen des Codes (nicht ganz, aber du weißt schon).

    Wenn sich da keiner mit einer Erleuchtung in Richtung Automatik meldet, werde ich das wohl mal genauso starten, wie du es vorgeschlagen hast.

    Du musst doch nur die Funktionsaufrufe in einer Funktion covern, die dann die Werte aus dem Aufruf in das Log schreibt und die Funktion startet.

    Hier mal auf die Schnelle (ungetestet) für Funktionen bis 5 Parameter (kannst du beliebig erweitern, das Muster sollte klar sein).

  • Dafür gibt es zig Ansatzmöglichkeiten. Ich hätte beim Aufruf des Logging die Parameter als einen String übergeben.

    Deine Elseif Variante funktioniert aber nur wenn du nur EINE Funktion hast die EINEN Parameter hat, das gleiche gilt für 2,3,4,5,N-Parameter.

    Hier mal mein Beispiel wie man das individuell umsetzen könnte (ungetestet!):

    4 Mal editiert, zuletzt von Moombas (2. Januar 2019 um 11:34)

  • Im engl. Wiki findest Du eine Auflistung der verfügbaren UDFs die Dich beim Logging / Debugging unterstützen.