TProcess Bug bei wiederholter Ausführung

TProcess Bug bei wiederholter Ausführung

Beitragvon MitjaStachowiak » 14. Nov 2018, 22:33 TProcess Bug bei wiederholter Ausführung

Hallo,
ich glaube, ich habe ein Bug in TProcess entdeckt. Wenn man die selbe Instanz von TProcess zur Ausführung mehrerer Programme nacheinander nutzt und dabei die Konsolenausgabe aus der Pipe mitschneidet, gibt es Probleme. Habe folgendes Testprogramm geschrieben:

Code: Alles auswählen
program tprocesstest;
 
uses process, classes, sysUtils;
 
var
  br    : longint;
  buf   : Array [0..1023] of char;
  proc  : TProcess;
  nExec : integer;
  nSave : integer;
  str   : TStringList;
 
begin
  if (paramStr(1) = 'recursive') then begin
    WriteLn('Nachricht 1');
    sleep(10);
    WriteLn('Nachricht 2');
  end else begin
    nExec := 0;
    nSave := 0;
    proc := TProcess.create(nil);
    repeat begin
      if (nExec = 3273) then begin
        WriteLn('critical')// you can debug from here
      end;
      proc.Executable := paramStr(0);
      proc.Parameters.add('recursive');
      proc.Options := [poUsePipes, poNoConsole];
      proc.ShowWindow := swoNone;
      proc.Execute;
      repeat begin
        br := proc.Output.Read({%H-}buf[0], Length(buf));
      end until (br = 0);
      nExec += 1;
      WriteLn('Exec '+inttostr(nExec));
      if (nExec >= nSave + 100) then begin // don't save too often as this may hurt the drive...
        nSave := nExec;
        str := TStringList.create;
        str.Add(inttostr(nSave));
        try
          str.saveToFile(ExtractFilePath(paramStr(0))+'nSaved.txt');
        except
        end;
        str.destroy;
      end;
    end until false; // run til infinity
    proc.destroy;
  end;
end.


Bei mir tritt dabei zuverlässig nach 3273 ein Exception bei process.Execute auf. Jedenfalls in Windows, aber nicht in Linux. Entdeckt habe ich das Bug in einem Tool, dass einige tausend PSPICE-Simulationen durchführen soll um eine Übertragungskennlinie zu ermitteln. Dieses führt in mehreren Threads mehrere Prozesse gleichzeitig aus. Hier war es dann so, dass irgendwann proc.Output.read hängengeblieben ist.

Ob es sich dabei um das gleiche Bug handelt, kann ich jetzt noch nicht sagen. Ich wollte das erstmal selber weiter untersuchen, kann den Code von TProcess.execute aber nicht debuggen. Habe schon das gesamte Programm und auch die IDE mit Debug-Symbolen re-kompiliert, aber in TProcess fehlen diese scheinbar weiterhin. Wie bekomme ich Lazarus dazu, auch diese Komponente mit Debug-Symbolen neu zu übersetzen?
MitjaStachowiak
 
Beiträge: 340
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

Beitragvon DonAlfredo » 15. Nov 2018, 07:32 Re: TProcess Bug bei wiederholter Ausführung

proc.Parameters.add('recursive');

The above is added into the params on every run !
So, you end up with thousands of command line params.
Just do :
Code: Alles auswählen
proc.Parameters.Clear

before every run.
DonAlfredo
 
Beiträge: 16
Registriert: 28. Sep 2017, 09:26

Beitragvon MitjaStachowiak » 15. Nov 2018, 19:08 Re: TProcess Bug bei wiederholter Ausführung

Oh, stimmt, das hatte ich nicht bedacht. Ist ja ein add und kein set :mrgreen:

Damit läuft das Programm schon mal über die "magische Grenze" von 3273. Mal abwarten, ob das auch in meiner Hauptanwendung die Ursache war.
MitjaStachowiak
 
Beiträge: 340
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

• Themenende •

Zurück zu Windows



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried