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?