TProcess Bug bei wiederholter Ausführung

Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 356
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

TProcess Bug bei wiederholter Ausführung

Beitrag von MitjaStachowiak »

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?

DonAlfredo
Beiträge: 32
Registriert: Do 28. Sep 2017, 10:26

Re: TProcess Bug bei wiederholter Ausführung

Beitrag von DonAlfredo »

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.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 356
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: TProcess Bug bei wiederholter Ausführung

Beitrag von MitjaStachowiak »

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.

Antworten