Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
1.918 Beiträge
 
Delphi 7 Professional
 
#25

AW: Programm stürzt nach mehren Stunden Laufzeit ab.

  Alt 8. Sep 2021, 11:41
Beim Logging sehe ich das Problem, dass ja nur alle 5000 Zeilen gespeichert wird.

Bei einem Programmabsturz kann man also schlimmstenfalls die letzten 5000 Zeilen im Protokoll nicht nachvollziehen. Die letzten Infos vor dem Auftreten eines Fehlers gehen also verloren.

Daher ein Vorschlag für die Änderung der Fehlerprotokollierung (nur hingedaddelt und nicht getestet):
Delphi-Quellcode:
procedure TForm1.AddLine(s : String);
var
          f : TextFile;
          iIOResult : Integer;
          sLogFile : String;
begin
    // Der Name der LOG-Datei ändert sich stündlich.
    // Wir schreiben die Meldungen sofort in eine Datei und speichern diese sofort.
    // Dadurch sollte auch die letzte Meldung vor dem Auftreten eines Fehlers
    // in der Datei einhalten sein.
    sLogFile := Format('%s%s.log',[programmpfad,FormatDateTime('YYYYMMDD_HH',Now)]);
    iIOResult := 0;
{$I-}
    AssignFile(f,sLogFile);
    try
      try
        if not FileExists(sLogFile) then begin
          ReWrite(f);
          iIOResult := IOResult;
        end else begin
          Append(f);
          iIOResult := IOResult;
        end;
        if iIOResult = 0 then begin
          WriteLn(f,FormatDateTime('yyyy.mm.dd hh.nn.ss,zzz',now),': ',s);
          Flush(f);
          iIOResult := IOResult;
          CloseFile(f);
          iIOResult := IOResult;
          iIOResult := 0;
        end;
      except
        on e : EOsError do MessageDLG(e.Message + #13#13 + SysErrorMessage(GetLastError),mtError,[mbOk],0);
        on e : Exception do MessageDLG(e.Message,mtError,[mbOk],0);
      end;
    finally
      if (iIOResult <> 0) and (iIOResult <> 32) then begin
        MessageDLG(Format('Fehler %d in AddLine.',[iIOResult]),mtError,[mbOK],0);
      end;
    end;
{$I+}
end;
Memo_Log wird zur Fehlerprotokollierung nicht mehr benötigt.
Absonsten kann ich momentan beim besten Willen nicht erkennen, woher da ein Programmabsturz ... kommen könnte.

Achso: Die Handles können ein Indikator für ein grundlegendes Problem sein, müssen es aber nicht.
Ein computerspezifisches Problem würd' ich hier eher nicht vermuten. Eher im Umfeld mit der FTP-Kommunikation.

ShellExecute ist 'ne Funktion, deren Rückgabewert man auswerten kann (https://docs.microsoft.com/en-us/win...hellexecutea):
Delphi-Quellcode:
procedure Tform1.start_bat(s:string);
var
  iShellEx : Integer;
  iSW : Integer;
begin
  LogHandles('start_bat_begin');
  case CheckBox_verstecke_cmd.Checked of
    true : iSW := SW_HIDE;
    false : iSW := SW_NORMAL;
  end;
  iShellEx := ShellExecute(Application.Handle, 'open', PChar(S), nil, nil, iSW);
  AddLine_Debug(Format('ShellExecute: %s Rückgabewert: %d',[s,iShellEx]));
  LogHandles('start_bat_ende');
end;
  Mit Zitat antworten Zitat