Einzelnen Beitrag anzeigen

Delphi.Narium

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

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

  Alt 7. Sep 2021, 18:33
In diesem Bereich würde ich mal weiterschauen, hier scheint es ja einen Handlezuwachs zu geben:
Code:
07.09.2021 17:09:27: (Debug) PrinServer_action fertig: Handles: 354
07.09.2021 17:09:30: (Debug) : LS Download von Server OK: FranceTest.pdf
07.09.2021 17:09:30: (Debug) : LS Download von Server OK: SwissTest.pdf
07.09.2021 17:09:31: (Debug) : LS Download von Server OK: GermanTest.pdf
07.09.2021 17:09:31: (Debug) Druckbefehl (LS) gesendet: GermanTest.pdf
07.09.2021 17:09:36: (Debug) Druckbefehl (LS) gesendet: SwissTest.pdf
07.09.2021 17:09:41: (Debug) Druckbefehl (LS) gesendet: FranceTest.pdf
07.09.2021 17:09:47: (Debug) : RE Download von Server OK: FranceTest.pdf
07.09.2021 17:09:47: (Debug) : RE Download von Server OK: SwissTest.pdf
07.09.2021 17:09:48: (Debug) : RE Download von Server OK: GermanTest.pdf
07.09.2021 17:09:48: (Debug) Druckbefehl (RE) gesendet: GermanTest.pdf
07.09.2021 17:09:54: (Debug) Druckbefehl (RE) gesendet: SwissTest.pdf
07.09.2021 17:09:59: (Debug) Druckbefehl (RE) gesendet: FranceTest.pdf
07.09.2021 17:10:04: (Debug) : ET1 Download von Server OK: FranceTest.pdf
07.09.2021 17:10:05: (Debug) : ET1 Download von Server OK: SwissTest.pdf
07.09.2021 17:10:05: (Debug) : ET1 Download von Server OK: GermanTest.pdf
07.09.2021 17:10:05: (Debug) Druckbefehl (ET1) gesendet: GermanTest.pdf
07.09.2021 17:10:10: (Debug) Druckbefehl (ET1) gesendet: SwissTest.pdf
07.09.2021 17:10:15: (Debug) Druckbefehl (ET1) gesendet: FranceTest.pdf
07.09.2021 17:10:21: (Debug) : ET2 Download von Server OK: FranceTest.pdf
07.09.2021 17:10:21: (Debug) : ET2 Download von Server OK: SwissTest.pdf
07.09.2021 17:10:22: (Debug) : ET2 Download von Server OK: GermanTest.pdf
07.09.2021 17:10:22: (Debug) Warte auf beendigung des PrintServer Vorgang...
07.09.2021 17:10:22: (Debug) PrinServer_action fertig: Handles: 475
07.09.2021 17:10:22: (Debug) Druckbefehl (ET2) gesendet: GermanTest.pdf
07.09.2021 17:10:28: (Debug) Druckbefehl (ET2) gesendet: SwissTest.pdf
07.09.2021 17:10:33: (Debug) Druckbefehl (ET2) gesendet: FranceTest.pdf
Protokolliere bitte in jeder Zeile auch die Handles, damit man sehen kann, bei welchem Schritt ein Zuwachs entsteht.

Das könnte z. B. in der Routine Start_Bat sein. Da bitte am Anfang und am Ende die Handles protokollieren, dann kann man erkennen, ob der Handlezuwachs durch den Aufruf von ShellExecute entsteht, was mich zwar verwundern würde, aber man weiß ja nie
Delphi-Quellcode:
procedure start_bat(s:string);
begin
  Addline_Debug(Format('Beginne start_bat(%s',[s]));
  if Form1.CheckBox_verstecke_cmd.Checked then
    ShellExecute(Application.Handle, 'open',PChar(S), nil, nil, SW_HIDE)
  else
    ShellExecute(Application.Handle, 'open',PChar(S), nil, nil, SW_NORMAL);
  Addline_Debug(Format('Beende start_bat(%s',[s]));
end;
Eventuell könntest Du aber auch Addline_Debug ergänzen, dann wird der Änderungsaufwand geringer:
Delphi-Quellcode:
// Je nach Delphi ist's auch schon in Winapi.Windows zu finden:
function GetProcessHandleCount(hProcess: THandle; var pdwHandleCount: DWORD): BOOL; stdcall; external 'kernel32.dll';

procedure Addline_Debug(s: String);
var
  HandleCount: DWORD;
begin
  if Form1.CheckBox_DebugLog.Checked then begin
    if GetProcessHandleCount(GetCurrentProcess, HandleCount) then begin
      addline(Format('(Debug) %s (Handles: %d)', [s, HandleCount]));
    end else begin
      addline(Format('(Debug) %s', [s]));
    end;
  end;
end;

procedure LogHandles(s : String);
var
  HandleCount: DWORD;
begin
  if GetProcessHandleCount(GetCurrentProcess, HandleCount) then
    Addline_Debug(Format('%s: Handles: %d',[s, HandleCount]));
end;
Ansonsten sehe ich momentan keine Stelle, an der ich mit einem Handlezuwachs rechnen würde. Aber das heißt ja nix.

Und dann ändere bitte noch die Zeile

ts_log.SaveToFile(programmpfad + 'log_OLD.txt');

in

ts_log.SaveToFile(Format('%s%s.log',[programmpfad,FormatDateTime('YYYYMMDD_HHNNSS.ZZZ',Now)]));

Damit bekommst Du dann eine Logfilehistorie und kannst dadurch das Geschehene auch über einen längeren Zeitraum protokollieren, musst allerdings dann die Logdateien manuell löschen, da sie nicht mehr überschrieben werden.

Geändert von Delphi.Narium ( 7. Sep 2021 um 20:56 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat