StringRegExp bringt Skript zum Absturz

  • Hallo liebe Community,

    ich bin ein begeisterter AutoIT Nutzer.
    Ich würd mich zwar noch nicht als AutoIT erfahren bezeichnen, aber ich hab schon die ein oder andere Sache damit realisiert.

    Ich hab folgendes Problem.

    Ich möchte mit Hilfe von Regulären Ausdrücken eine relativ große Log-Datei durchsuchen.
    Wenn in dieser Log-Datei eine bestimmte "Suchmaske" vorkommt möchte ich eine Email verschicken.
    Das klappt soweit auch alles.
    Doch manchmal völlig unregelmäßig und ohne erkennbare Logik schmiert mein Skript einfach ab. (Windowsfehlermeldung: AutoIT.exe muss beendet werden; soll gesendet werden? ja,nein)
    Ich hab schon lange an der Ursache rumgesucht, und konnte mittels Tracing die Funktion StringRexExp als Fehlerquelle ausfindig machen.
    Ich untersuche mit der Funktion StringRegExp Zeile für Zeile die Logfile und da diese um die 500000 Zeilen hat, wird StringRegExp auch entsprechend oft aufgerufen.
    Ich hab im Changelog gefunden, dass die Funktion schon einmal gefixt wurde. Meint ihr es kann noch ein weiteres Problem in dieser Funktion bestehen? (Ich benutze 3.2.12.1)

    Interessante Merkmale die ich beim Tüfteln beobachtet habe:

    Schreibe ich an irgendeine Zeile nur einen Kommentar, kann es sein der Fehler(Absturz) tritt nicht mehr auf.
    Mach ich die Zeile wieder raus kommt er wieder.
    Schreib ich an irgendeiner unrelevante Stelle beispielsweise einen Log-Eintrag in mein eigenes Log kann er auch weg sein.
    Durchsuche ich kleine Logfile tritt der Fehler entweder seltener oder gar nie auf.
    Ändere ich im Skript den Namen der Log-Datei die durchsucht werden soll kann der Fehler auf einmal weg sein. (Obwohl es die gleiche Datei durchsucht).
    Klappt es zufällig das er eine große Logdatei durchsucht und ich probier es direkt danach mit einer etwas kleineren oder größeren Datei kommt es wieder zum Absturz. :(


    Ihr merkt es vielleicht, ich weiß einfach nicht mehr weiter.
    Ich hoff ihr könnt mir weiterhelfen
    Für weiter Fragen steh ich gern zur Verfügung

    Vielen Dank im Voraus

    Ben

  • Hi BugFix,

    danke für die schnelle Antwort.
    Das ist mein Pattern:

    (.*Overly long line received.*IP=207\.46\.248\.42.*)

    Hm, wenn ich da die WS raus mach, findet StringRegExp doch keinen Match mehr.
    In meiner Logdatei steht des ja genau so drin, (Overly long line received)
    oder bin ich gerade falsch gewickelt?

    Wenn ich die CRs raus mach bringt das leider keine Verbesserung.
    Hab sowohl meine $line als auch mein Pattern mit StringStripCR gesäubert. Fehler kommt immernoch.
    Was mich so wundert, warum kommt es manchmal und manchmal net, und völlig ohne erkennbare Logik...

    Thx
    Ben

  • Ich lese immer Zeile für Zeile ein.

    Sprich FileReadLine
    und dann StringRegExp mit der Zeile und dem Pattern.

    [autoit]

    If StringRegExp($line, $maske[$i], 0, 1) Then

    [/autoit]


    wenn was gefunden dann _emailSenden()

    Das ganze in einer While Schleife die unterbrochen wird, wenn FileReadLine -1 liefert (letzte Zeile in Datei erreicht)

  • Hallo zusammen.

    Ich hab gedacht ich poste jezt einfach mal einen Teil meines Skiptes.
    Ist denk es ist dann einfacher zu verstehen.
    Ich hab die Schritte kommentiert, müsste also halbwegs verständlich sein.

    Wäre super wenn ihr mal drüberschauen könntet und vllt findet ihr noch einen versteckten Fehler den ich einfach nicht finden möchte.

    [autoit]

    ;für jede Maske durchgehen (in $maske[] sind meine Masken enthalten)
    For $i = 0 To $maskenanzahl-1 Step 1
    ; speichert die Anzahl der Treffer
    $anzahlTreffer = 0
    ;da er für jede Maske die Datei neu durchgehen soll muss er sie neu öffnen
    $file = FileOpen($tempLogDatei, 0)
    If $file == -1 Then
    ;Funktion die mir in eine eigene Logdatei schreibt
    _logge ("Fehler beim FileOpen")
    Else
    _logge("Datei geöffnet")

    While 1
    ;lese solange Zeile für Zeile bis am Ende der Datei angekommen
    $line = FileReadLine($file)
    ;wenn Ende der Datei erreich
    If @error == -1 Then
    ExitLoop
    ElseIf @error == 1 Then
    _logge("Fehler bei FileReadLine")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ;die Suchmaske wird auf jede Zeile angewandt(beim Aufruf dieser Funktion kommt nach meinen Erkenntnissen der Absturz)
    If StringRegExp($line, $maske[$i], 0, 1) Then
    $anzahlTreffer = $anzahlTreffer + 1
    ;Email senden Funktion aufrufen, die line und die Nummer der Maske übergeben
    _emailSenden($line, $i+1)
    ElseIf @error == 2 Then
    _logge("Fehler bei RegExp " & @error)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Wend
    ;Datei wieder schließen
    FileClose($file)
    EndIf
    _logge("Maske" & $i+1 & " lieferte " & $anzahlTreffer & " Treffer" )
    Next

    [/autoit]

    Ich hab jetzt auch festgestellt, dass es nichts mit der größe der zu durchsuchenden Datei zu tun hat.
    Selbst bei einer kleineren Datei mit etwa 20000 Zeilen tritt der Absturz völlig willkürlich auf.
    Ich zähl auf euch.

    Grüße
    Ben

  • vielleicht versucht dein script unzählige emails fast zeitgleich zu verschicken...
    du solltest alle emails in eine txt-datei zusammenfassen und erst am ende gemeinsam versenden.

    bzw. versuch mal die _emailsenden zu deaktivieren - tritt der fehler dann noch immer auf?

  • Hi Eukalyptus,

    guter Hinweiß, das kanns aber nicht sein.
    Auch ohne _emailsenden tritt das Problem auf.
    Außerdem hab ich beim Senden das tracen aktiviert, somit seh ich also ganz genau wie viele Mails es verschickt.
    Das ist meistens nur eine oder gar keine, sollte also kein Problem darstellen.
    Ich möchte ja für jeden Treffer eine Mail verschicken, sonst würde ich tatsächlich deinen Weg wählen.

    Bin immernoch Hilflos,
    Grüße
    Ben