AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Konsolenanwendung mit Umleitung debuggen
Thema durchsuchen
Ansicht
Themen-Optionen

Konsolenanwendung mit Umleitung debuggen

Ein Thema von Union · begonnen am 7. Jun 2019 · letzter Beitrag vom 7. Jun 2019
Antwort Antwort
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#1

Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 10:31
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 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
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 11:27
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 12:10
Bei Google suchendelphi cgi debuggen

Da was bei?
https://stackoverflow.com/questions/...-a-windows-cgi
https://www.experts-exchange.com/que...plication.html
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 12:16
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,
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#6

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 12:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 12:54
Arbeitest Du mit 'nem Webmodul?
Ja, ich habe diese Anwendung geerbt, ist XE3.
Delphi-Quellcode:
begin
    Application.Initialize;
    Application.WebModuleClass := WebModuleClass;
    Application.Run;
end.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#8

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 15:36
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?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 18:09
Apache mit feststehender Konfiguration. Das muss weiterhin als CGI exe laufen. Frag nicht warum.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#10

AW: Konsolenanwendung mit Umleitung debuggen

  Alt 7. Jun 2019, 19:01
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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