Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#2

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 11:12
Hallo,

ich möchte eine Konsolenanwendung debuggen, die ihre Eingabe per Dateiumleitung erhält. Wird die Anwendung von der Kommandozeile heraus aufgerufen, funktioniert das auch. Im integrierten Debugger mit entsprechenden Startparametern allerdings nicht - dort wartet die Anwendung dann auf eine Tastatureingabe.

Delphi-Quellcode:
Program Redirect;


{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  Line : string;
begin
  try
    Readln(Line);
    writeln('Output', Line);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Start -> Parameter : <input.txt

Inhalt der Datei: Eingabe<CR/LF>

Die einzige Möglichkeit die ich bisher gefunden habe, ist das Einfügen einer Warteschleife:
Delphi-Quellcode:
      {$ifdef DEBUG}
      writeln('Debugger');
      while not IsDebuggerPresent do
      begin
        Sleep(100);
      end;
      asm
        int 3;
      end;
      {$endif}
Dann wird die Anwendung auf der Kommandozeile gestartet und über Start->Mit Prozess verbinden funktioniert es.

Ebenfalls ausprobiert habe ich es mit cmd.exe /c als Hostanwendung, das Verhalten ändert sich aber nicht.

Wie kriege ich das mit dem integrierten Debugger und direktem Start hin?
Geht nicht, da dieses redirecting eine Funktion des command interpreters ist und nicht des Programms oder des Betriebssystems selbst. Was aber relativ einfach machbar ist: gib dem Programm eine Option, den Namen der Input-Datei als Parameter übergeben zu bekommen.

Allen Kode, der mit dem Input arbeitet, packst Du in eine Prozedure mit einen Var-Parameter vom Typ Textfile.

Beim Start überprüfst Du dann, ob ein Parameter übergeben wurde, wenn ja machst Du ein Textfile mit diesem Parameter auf und übergibst es an die Prozedure, wenn nein übergibst Du stattdessen Input (das ist der interne Name für stdin) an die Prozedur. Innerhalb derselben mußt Du nur bei jedem Read oder ReadLn den Namen des Parameters mit verwenden.

Für die weitere Verarbeitung spielt es keine Rolle, ob der Input aus einer Textdatei oder aus stdin kommt.
Peter Below
  Mit Zitat antworten Zitat