Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Konsolenanwendung mit Umleitung debuggen (https://www.delphipraxis.net/200924-konsolenanwendung-mit-umleitung-debuggen.html)

Union 7. Jun 2019 09:31

Konsolenanwendung mit Umleitung debuggen
 
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?

peterbelow 7. Jun 2019 10:12

AW: Konsolenanwendung mit Umleitung debuggen
 
Zitat:

Zitat von Union (Beitrag 1434117)
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.

Union 7. Jun 2019 10:27

AW: Konsolenanwendung mit Umleitung debuggen
 
Danke für die Idee. Das Mini-Programm dient natürlich nur der Illustration. Die Lesevorgänge erfolgen außerhalb meines Einflussbereichs in TCGIRequest.ReadString(). Es handelt sich um den Contentstream einer CGI.

Delphi.Narium 7. Jun 2019 11:10

AW: Konsolenanwendung mit Umleitung debuggen
 
Bei Google suchendelphi cgi debuggen

Da was bei?
https://stackoverflow.com/questions/...-a-windows-cgi
https://www.experts-exchange.com/que...plication.html

Union 7. Jun 2019 11:16

AW: Konsolenanwendung mit Umleitung debuggen
 
Leider nicht. Der idDebugger ist uralt und nicht zum Laufen zu bekommen. Und der content kann bei HTTPCGI nicht über eine Environment Variable gesetzt werden,

Delphi.Narium 7. Jun 2019 11:27

AW: Konsolenanwendung mit Umleitung debuggen
 
Was ist mit ISAPI-Dll aus dem CGI machen und dann den Webserver mit dem Debugger verbinden?

Arbeitest Du mit 'nem Webmodul?

CGI-Programm:
Delphi-Quellcode:
program CGI;

{$APPTYPE CONSOLE}

uses
  WebBroker,
  CGIApp,
  Unit1 in 'Unit1.pas' {wm: TWebModule};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(Twm, wm);
  Application.Run;
end.
entsprechende ISAPI.DLL
Delphi-Quellcode:
library Isapi;

uses
  WebBroker,
  ISAPIApp,
  Unit1 in 'Unit1.pas' {wm: TWebModule};

{$R *.RES}

exports
  GetExtensionVersion,
  HttpExtensionProc;

begin
  Application.Initialize;
  Application.CreateForm(TWebModule1, WebModule1);
  Application.Run;
end.
Achso: Das ist aus Delphi-7-Zeiten, passt ja zu der Delphiversion in Deinem Profil ;-)

Union 7. Jun 2019 11:54

AW: Konsolenanwendung mit Umleitung debuggen
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1434136)
Arbeitest Du mit 'nem Webmodul?

Ja, ich habe diese Anwendung geerbt, ist XE3.
Delphi-Quellcode:
begin
    Application.Initialize;
    Application.WebModuleClass := WebModuleClass;
    Application.Run;
end.

Delphi.Narium 7. Jun 2019 14:36

AW: Konsolenanwendung mit Umleitung debuggen
 
Dann sollte eigentlich ein Umbau in 'ne ISAPI.dll möglich sein und der Debugger mit dem Webserver verbunden werden können, um so die DLL zu debuggen.

Was für 'nen Webserver kannst / musst Du nutzen?

Union 7. Jun 2019 17:09

AW: Konsolenanwendung mit Umleitung debuggen
 
Apache mit feststehender Konfiguration. Das muss weiterhin als CGI exe laufen. Frag nicht warum.

Delphi.Narium 7. Jun 2019 18:01

AW: Konsolenanwendung mit Umleitung debuggen
 
Naja, ich dachte eigentlich eher:

Zum Debuggen mal 'ne DLL draus machen und wenn die dann fertig ist und ordentlich läuft, wird's wieder ein CGI-Programm.
Man braucht ja für DLL und CGI "nur" zwei unterschiedliche DPRs, die eingebundene Unit bleibt ja und funktioniert in beiden.

Musst Du denn zum Debuggen den Apache nehmen oder könntest Du dazu auch temporär 'nen anderen Server nutzen, also 'nen anderen Rechner mit 'nem anderen Webserver (und wenns sein muss notfalls auch in 'ner VM)?

Klar, ich weiß natürlich nicht, welche Abhängigkeiten sonst noch so bestehen, auf was die CGI.exe so alles zugreifen muss, da kann dann "mal eben 'nen anderen Webserver auf 'nem anderen Rechner nehmen" die eine oder andere Stunde oder Woche Arbeit bedeuten.

Läuft der Apache als Service?

Wenn ja, ist er mit "Interact with desktop" konfiguriert? Ohne das geht's nicht.

Wahllose "Prosa" zum Thema, eventuell ist ja doch was nützliches dabei:

https://forum.lazarus.freepascal.org...?topic=21931.0
https://stackoverflow.com/questions/...-a-windows-cgi
https://www.swissdelphicenter.ch/en/...ticle.php?id=2
https://www.delphipraxis.net/64426-d...-debugger.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz