Definiere bitte kurz: "Programm ist abgestürzt"
Das Programm ist "einfach" weg?
Keine Meldung bezüglich Zugriffsverletzungen ...
Einfach so aus Taskleiste, Liste der laufenden Programm ... verschwunden?
Habe vor Jahren auch mal auf Systemen mit TrendMicro gearbeitet, weiß aber nicht mehr, ob und wie da protokolliert wird.
Gibt es da irgendwelche Logfiles ... in denen zum Zeitpunkt des Programmabsturzes irgendwas protokolliert wird?
Insgesammt Deine Routine "aussagefreudiger" machen:
(ungetestet hingeschrieben - als Idee)
Delphi-Quellcode:
procedure TJobServerForm.VerschiebePdf;
var
files: TStrings;
i:integer;
ziel, zielpfad:
string;
ok: boolean;
LogFile :
String;
begin
LogFile := Format('
c:\TJobServerForm.VerschiebePdf.%s.log',[AnsiReplaceText(DateTimeToStr(Now),'
:','
.')]);
memo.Lines.Add(Format('
Starte Routine: TJobServerForm.VerschiebePdf - %s',[DateTimeToStr(Now)]));
memo.Lines.SaveToFile(LogFile);
files := TStringList.Create;
memo.Lines.Add(Format('
vor GetFilesMatchInPath(%s, %s, files, false)',[LokalPdfDir,'
*.pdf']));
memo.Lines.SaveToFile(LogFile);
GetFilesMatchInPath(LokalPdfDir, '
*.pdf', files, false);
memo.Lines.Add('
gefundenen Dateien:');
memo.Lines.Add(files.Text);
memo.Lines.Add(Format('
hinter GetFilesMatchInPath(%s, %s, files, false)',[LokalPdfDir,'
*.pdf']));
memo.Lines.SaveToFile(LogFile);
try
for i := 0
to files.Count - 1
do begin
try
memo.Lines.Add(Format('
%d/%d %s',[i+1,files.Count,files[i]]));
zielpfad := WithBackSlash(PdfDir) + ExportSubDirFromFileName(files[i]);
memo.Lines.Add(Format('
Zielpfad: %s',[ZielPfad]));
if not DirectoryExists(zielpfad)
then begin
memo.Lines.Add(Format('
ForceDirectories: %s',[ZielPfad]));
ForceDirectories(zielpfad);
end;
ziel := zielpfad + ExtractFileName(files[i]);
memo.Lines.Add(Format('
Ziel: %s',[Ziel]));
memo.Lines.Add(Format('
vor CopyFile(%s,%s, false)',[files[i],ziel]));
memo.Lines.SaveToFile(LogFile);
// ShowMessage('#'); // ist zwar schön
// ShowMessage(Files[i]); // dürfte aber aussagefähiger sein ;-)
ok := CopyFile(PChar(files[i]), PChar(ziel), false);
memo.Lines.Add(Format('
hinter CopyFile(%s,%s, false)',[files[i],ziel]));
memo.Lines.SaveToFile(LogFile);
if ok
then begin
memo.Lines.Add(Format('
vor DeleteFile: %s',[files[i]]));
memo.Lines.SaveToFile(LogFile);
if DeleteFile(files[i])
then begin
memo.Lines.Add(Format('
erfolgreich: DeleteFile: %s',[files[i]]));
end else begin
memo.Lines.Add(Format('
nicht erfolgreich: DeleteFile: %s',[files[i]]));
end;
memo.Lines.Add(Format('
hinter DeleteFile: %s',[files[i]]));
memo.Lines.SaveToFile(LogFile);
end;
except
on e :
Exception do begin
memo.Lines.Add(Format('
Exception bei Datei: %s',[files[i]]));
memo.Lines.Add(Format('
Fehlermeldung: %s',[e.
Message]));
memo.Lines.SaveToFile(LogFile);
RaiseLastOSError;
end;
end;
end;
finally
files.Free;
end;
memo.Lines.Add(Format('
Beende Routine: TJobServerForm.VerschiebePdf - %s',[DateTimeToStr(Now)]));
memo.Lines.SaveToFile(LogFile);
end;
Lassen sich anhand der so erstellten Logfiles irgendwelche Systematiken erkennen?
Programmabsturz beim zweiten Aufruf immer bei der
- ersten Datei?
- gleichen Datei?
- einem bestimmten Pfad?
Das
memo.Lines.SaveToFile(LogFile);
alle Nas' lang aufzurufen, ist sicherlich nicht performant, aber man hat so die Chance bei beliebigen Zwischenschritten die Meldungen auf die Platte zu bekommen, da bei 'nem Absturz beim folgenden Befehl, die Infos aus dem Memo schon weggeschrieben sind.
Alternative 'ne Loggingfunktion nehmen, die die Ausgabedatei vor jedem Schreibvorgang öffnet und nach jedem Schreibvorgang schließt.