AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eklatante Probleme mit Debuggen

Ein Thema von freimatz · begonnen am 26. Jun 2023 · letzter Beitrag vom 6. Jul 2023
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Eklatante Probleme mit Debuggen

  Alt 27. Jun 2023, 14:23
Beim Service gibt es doch diesen DDService, der noch mehr Methoden als TService implementiert, den kann man auch debuggen...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#12

AW: Eklatante Probleme mit Debuggen

  Alt 27. Jun 2023, 14:42
Ist jetzt schon über 10 Jahre her, aber im Grunde ging es darauf hinaus, jenes SvcMgr.Application.Run nachzubauen, damit es eben nicht mehr abbricht, wenn nicht als Dienst gestartet.
Falls ich nichts vergessen oder zu viel rausgelöscht habe.

ServiceExecute läuft eigentlich in einem Thread und könnte man dort noch ein CreateAnonymusThread drumrummachen, aber hatte ich mir zum einfacheren Debuggen damals erspart.

Delphi-Quellcode:
procedure TMyService.ServiceCreate(Sender: TObject); // TService.OnCreate
var
  Started: Boolean;
  DebugWindow: TForm;
begin
  FIsDebugging := IsDebuggerPresent or FindCmdLineSwitch('DEBUG', ['-', '/'], True);

  // Das war der Teil, damit es sich mit der Console verbindet und man dann einfach z.B. via WriteLn('log message'); was ausgeben kann.
  // Oder z.B. noch ein Memo ins DebugWindow.
  // Gebe in die Console, sowie ins Windows-EreignisLog, eh nur wichtigsten Stati aus, damit der Admin vor Ort einen Überblick bekommt (der Rest in normale Logdateien)
  if FIsDebugging then
    AttachConsole(ATTACH_PARENT_PROCESS);

  try
    if FIsDebugging then begin
      MyService := Self; // wird sonst von Application.CreateForm gesetzt, aber durch die Messageloop kommt es dort nicht vorbei

      Forms.Application.MainFormOnTaskBar := False; // geht leider doch nicht ohne Form
      Forms.Application.CreateForm(TForm, DebugWindow); // Form zum Beenden und für Eintrag in Taskbar
      DebugWindow.Name := 'DebugWindow';
      DebugWindow.Caption := 'Debug-Mode: ' + DM1.DSDisplayName + GenerateViewID(True);
      DebugWindow.OnCloseQuery := DebugServiceClose;
      DebugWindow.Width := 500;
      DebugWindow.Height := 125;
      DebugWindow.Visible := True;
      with TButton.Create(DebugWindow) do begin
        Name := 'DebugWindowsClose';
        Parent := DebugWindow;
        Caption := 'Close';
        Width := 100;
        OnClick := DebugServiceClose2;
      end;

      { SvcMgr.Application.Run;  // bricht ab, wenn nicht als Service gestartet, darum dessen Code hier nachgebaut }
      if FindCmdLineSwitch('INSTALL', ['-', '/'], True) then begin
        TServiceApplicationAccess(SvcMgr.Application).RegisterServices(True, FindCmdLineSwitch('SILENT', ['-', '/'], True));
      end else if FindCmdLineSwitch('UNINSTALL', ['-', '/'], True) then begin
        TServiceApplicationAccess(SvcMgr.Application).RegisterServices(False, FindCmdLineSwitch('SILENT', ['-', '/'], True));
      end else begin
        Started := True;
        ServiceStart(Self, Started);
        if Started then begin
          ServiceExecute(nil); // der Service-Thread existiert/läuft nicht, wenn die EXE nicht aus der Service-Verwaltung gestartet wurde, daher manueller Aufruf, um die BackgroundThreads zu starten
          while not Terminated and not Forms.Application.Terminated do
            try
              Forms.Application.ProcessMessages;
              Sleep(10);
            except
              {error logging ...}
            end;
          Forms.Application.Terminate;
          for i := 1 to 30 do begin // Bissl warten, damit sich die BackgroundThreads sich noch rechtzeitig beenden können.
            (DebugWindow.FindComponent('DebugWindowsClose') as TButton).Caption := Format('Terminate (%ds)', [31 - i]);
            Forms.Application.ProcessMessages;
            Sleep(1*MSecsPerSec);
          end;
          try DebugWindow.Free; except end;
        end else begin
          Forms.Application.Terminate;
        end;
      end;
    end;
  except
    on E: Exception do begin
      if ExitCode = 0 then
        ExitCode := 38; // Fehlercode für IF ERRORLEVEL im aufrufenden Batch
      raise;
    end;
  end;
end;

procedure TMyService.DebugServiceClose(Sender: TObject; var CanClose: Boolean);
begin
  if not Forms.Application.Terminated then
    DebugServiceClose2((Sender as TForm).FindComponent('DebugWindowsClose'));
end;

procedure TMyService.DebugServiceClose2(Sender: TObject);
begin
  if not ContainsText(TButton(Sender).Caption, 'Terminate') then begin
    //if Assigned(MyService) then
    // MyService.Terminate; // hier gibt es zwar ein Terminated, aber kein Terminate -> Status wird aus ServiceThread.Terminated geholt
    if Assigned(MyService) and Assigned(MyService.ServiceThread) then
      MyService.ServiceThread.Terminate; // eigentlich aktuell nicht nötig, da im Debugmodus der Service-Thread nicht existiert/läuft -> siehe ServiceExecute(nil);
    Forms.Application.Terminate;
    TButton(Sender).Caption := 'Terminate (30s)';
  end else begin
    // Wenn der Apps nicht auf Terminate hören will, dann eben die harte Tour. (beim zweiten Klicken auf Close)
    TerminateProcess(GetCurrentProcess, 1); // Halt() versucht noch die Units zu entladen, wobei es hängen bleiben kann.
    Halt(1);
  end;
end;
Kurzfassung:
Delphi-Quellcode:
procedure TMyService.ServiceCreate(Sender: TObject); // TService.OnCreate
begin
  if IsDebuggerPresent or FindCmdLineSwitch('DEBUG', ['-', '/'], True) then begin
    MyService := Self; // wird sonst von Application.CreateForm gesetzt, aber durch die MessageLoop kommt es dort nicht vorbei

    { wie SvcMgr.Application.Run; }
    if FindCmdLineSwitch('INSTALL', ['-', '/'], True) then
      TServiceApplicationAccess(SvcMgr.Application).RegisterServices(True, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    else if FindCmdLineSwitch('UNINSTALL', ['-', '/'], True) then begin
      TServiceApplicationAccess(SvcMgr.Application).RegisterServices(False, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    else begin
      Started := True;
      ServiceStart(Self, Started);
      if Started then begin
        ServiceExecute(nil);
        while not Terminated and not Forms.Application.Terminated do // allerdings wird die Schleife ohne TForm sich eventuell vorzeitig beenden
          try
            Forms.Application.ProcessMessages;
            Sleep(10);
          except
            {error logging ...}
          end;
        Forms.Application.Terminate;
      end else
        Forms.Application.Terminate;
    end;
  end;
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Jun 2023 um 14:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.586 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Eklatante Probleme mit Debuggen

  Alt 27. Jun 2023, 23:55
Ich habe das mit dem Dienst auch mal gemacht, indem ich einfach geschaut habe, ob die Exe von der services.exe gestartet wurde. Wenn nicht, wurde ein Formular angezeigt, mit dem man den Installationsstatus sehen konnte und den Dienst auch z.B. installieren konnte.
Leider verhält sich aber ein Dienst nicht immer genauso, weshalb ich das Warten eingebaut habe, bis der Debugger dran hängt.

Aber das ist hier ja nicht das Thema.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Eklatante Probleme mit Debuggen

  Alt 29. Jun 2023, 08:59
Habe jetzt mal einen Test gemacht mit dem Attach. Also
* Delphi ist offen
* App ausserhalb gestartet
* In Delphi Run/Attach to Process
* Process aus der Liste ausgewählt (1)
* Attach
* App stoppt im Debugger irgendwo, CPU-Fenster
* F9
* Bediene die App entsprechend.
Allerdings kein Halt am Breakpoint, blaue Punkte sind auch nicht da.

Zu 1: dort ist das substituierte Laufwerk angezeigt sondern die Quelle, ist das ein Problem?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#15

AW: Eklatante Probleme mit Debuggen

  Alt 29. Jun 2023, 10:44
Im DebuggerLog, da müsste irgendwo ein "Lade Modul" zu finden sein, mit dem Namen deiner EXE .... wie sieht diese Zeile aus?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Eklatante Probleme mit Debuggen

  Alt 29. Jun 2023, 11:17
Habe das Logging aktiviert und habe nun drei Dateien. Nur in der dbk_16380.log finde ich den App-Namen. Er kommt häufig vor. Erster Eintrag ist (anonymisiert):
[20412: 61620 ] [71] 7648 52D:\Project\40_20244\appfolder\sysWin64\AppName.e xe [CL=00000000]
In keiner Zeile ist der substituierte Laufwerk.

Habe nun im Log gesucht nach der unit wo ich einen Breakpoint gesetzt habe:
[13812: 28099 ] UNVER bkPt 2713d70 (J:\appfolder\_dev\src\_Domain.Bereich\lala.lu.Dom ain.Bereich.Impl.pas 3302) isVer 0 isInv 0 nLoc 0 [CL=00000000]
Dort ist das Laufwerk drin.

Geändert von freimatz (29. Jun 2023 um 13:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.586 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Eklatante Probleme mit Debuggen

  Alt 29. Jun 2023, 12:24
Hast du externe Debugsymbole aktuell aktiviert? Verwendest du eine Projektgruppe?

Eventuell könnte der Process Monitor helfen, falls der Debugger die Debuginformationen an der falschen Stelle sucht. Bisher konnte ich solche Probleme aber vorher schon lösen, so dass ich mir das bisher nie anschauen musste. Ich weiß also nicht, ob dort falsche Dateizugriffe auftauchen könnten oder ähnliches. Einen Versuch wäre es wert.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Eklatante Probleme mit Debuggen

  Alt 29. Jun 2023, 15:21
Hallo,
wir waren jetzt zu dritt einige Stunden dran und vieles (wieder einmal) ausprobiert
Was meinst Du mit Debugsymbole. Die dcp oder rsm? Bei 64-Bit werden immer rsm-Dateien erzeugt egal ob die Option "Include remote debug symbols" an oder aus ist. Sie ist aber an.

Process Monitor:
1. die bpl werden geladen von J: (subst)
2. (nur) die rsm von der Hauptexe wird geladen von D:
3. es gibt zig CreateFile "C:\DevTools\Embarcadero\Studio\22.0\bin\<UNKNOWN> .rsm"

Diese "<UNKNOWN>" sieht man auch im Toolwindow Modules

Bei einem Kollegen funktioniert das Attachen so auch und ein Breakpoint von ihm, der auch sonst funktionierte, hat auch damit funktioniert. Und die Stelle die bei mir nie funktioniert bei ihm auch nicht. Und die "<UNKNOWN>" hat er auch, obwohl es bei ihm funktionierte.

Geändert von freimatz (29. Jun 2023 um 15:31 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Eklatante Probleme mit Debuggen

  Alt 29. Jun 2023, 16:03
Was heißt denn eigentlich "substituierte Laufwerk"? Hab jetzt nicht den ganzen Faden hier vor Augen, falls schon beantwortet.
Ist das eine RAM-Disk-Laufwerk oder ein zugewiesener Buchstabe für ein Netzlaufwerk (z.B. \\EuerPfadZumNetzlaufwerk\BeliebigerUnterordner)?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Eklatante Probleme mit Debuggen

  Alt 29. Jun 2023, 16:10
Mit dem subst Befehl
c:\>subst
J:\: => D:\Project\40_20244

Geändert von freimatz (29. Jun 2023 um 16:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:52 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