Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dunkelgrüner Breakpoint ? (https://www.delphipraxis.net/55406-dunkelgruener-breakpoint.html)

EccoBravo 20. Okt 2005 13:37


dunkelgrüner Breakpoint ?
 
Neue Dummi-Frage:

Wundere mich, daß beim debuggen Programm am Haltepunkt nicht unterbrochen wird (obwohl es müßte).
Nun Beobachtung: In einigen Codestellen ist der Haltepunkt beim Setzen nicht rot sondern dunkelgrün. Oder ein gesetzter roter Haltepunkt wird beim Compilieren dunkelgrün. Das Programm hält dann an diesen Punkten nicht an. Was hat das auf sich?
(BD7 Enterprise)

Vielen Dank

E. B.

Treffnix 20. Okt 2005 13:40

Re: dunkelgrüner Breakpoint ?
 
grün bedeutet, dass das Programm an dieser Zeile niemals nicht vorbeilaufen wird. In der Regel, weil du die Funktion nirgends benutzt oder weil du ne Zeile ausgewählt hast, in der kein Befehl steht. Evtl. wurds auch wegoptimiert.

Wenn du z.B. bei

Delphi-Quellcode:
showmessage( 'Ich wollte nur mal Hallo sagen: '#13#10 +
             'Hallo' );
den Breakpoint auf die zweite Zeile setzen würdest, würde er dort auch nicht anhalten

Mattin 20. Okt 2005 13:42

Re: dunkelgrüner Breakpoint ?
 
Zitat:

Zitat von EccoBravo
Neue Dummi-Frage:

Wundere mich, daß beim debuggen Programm am Haltepunkt nicht unterbrochen wird (obwohl es müßte).
Nun Beobachtung: In einigen Codestellen ist der Haltepunkt beim Setzen nicht rot sondern dunkelgrün. Oder ein gesetzter roter Haltepunkt wird beim Compilieren dunkelgrün. Das Programm hält dann an diesen Punkten nicht an. Was hat das auf sich?
(BD7 Enterprise)
E. B.

Steht der Breakpoint vielleicht auf einer Abfrage IF/ WHILE / FOR oder so ??

jim_raynor 20. Okt 2005 13:42

Re: dunkelgrüner Breakpoint ?
 
Das bedeutet, dass an dieser Stelle kein Ausführbarer Code ist. Zu erkennen an dem kleinen blauen Punkt beim Starten in Delphi.

An diesen Stellen kann dann auch nicht angehalten werden, da dort kein ausführbarer Code ist. Eine Ursache kann zum Beispiel der Optimierer sein, der Teile des Codes wegoptimiert hat, weil diese einfach nicht benötigt werden oder ganze Prozeduren überhaupt nicht verwendet werden.

Falls das "Problem" in einer ganzen Unit auftritt, liegt es meistens an fehlerhaften Verzeichnissen.

EccoBravo 20. Okt 2005 14:41

Re: dunkelgrüner Breakpoint ?
 
Vorgestellt habe ich mir das mit dem ausführbaren Code auch so,
aber so ganz glaube ich das nicht, denn die blauen Punkte stehen nicht vor Kommentarzeilen, und END-Zeilen. Dafür stehen sie ganz willkürlich innerhalb von BEGIN...END-Bereichen (mal ja mal nicht) vor ausführbaren Zeilen.
Und dann noch
färben sich beim Kompilieren auch mal die Haltepunkte der nicht blau punkteten Zeilen dunkelgrün und die Haltepunkte der Blau bepunkteten Zeilen bleiben rot. Also alles ziemlich unregelmäßig. Anhalten tut der Debugger in diesen Fällen nie, obgleich er müßte.

So und nun zum Optimizer,
Gehört habe ich auch schon so etwas, Mein Eindruck ist, daß dieser Optimizer ganze Quelltextpassagen einfach weggelassen hat. Ich hatte schon früher so etwas beobachtet, mich geärgert/ gewundert. Ohne diesen Optimizer zu verstehen habe ich mir geholfen, indem ich ganze Kode-Passagen umgestellt hatte, retundante Bedingungen programmiert habe usw. Zufrieden bin ich damit aber überhaupt nicht! Die Transparenz der Programme geht damit unweigerlich verloren.
Nun, kann mir jemand verraten, wie ich auf das Verhalten des Optimizers Einfluß nehmen kann?
Ich will den Kram endlich begreifen.

Am Rande sei mir wegen meiner gehäuft dummen Fragen verziehen. Als Autodidakt bin ich halt immer noch ein Amateur, obgleich ich auf 20-jährige, teils recht pragmatische Erfahrungen zurückblicken kann.
Ursprünglich als neue Dummie-Frage tituliert, sei diese Frage ernst.

Vielen Dank, E. B.

Treffnix 20. Okt 2005 14:54

Re: dunkelgrüner Breakpoint ?
 
Menü Projekt -> Optionen -> Häkchen bei Optimierung weg

Bevor du dann die endgültige Programmversion compilierst, wenn alle Fehler beseitigt sind, solltest du den Haken aber wieder setzen.

*edit*
Wäre vielleicht ganz hilfreich, wenn du mal ein paar Zeilen Beispielcode posten würdest, wo ein Breakpoint nicht funktioniert, obwohl er es deiner Meinung nach müsste.

EccoBravo 20. Okt 2005 15:18

Re: dunkelgrüner Breakpoint ?
 
Na klar:
Delphi-Quellcode:
...
if <bedingung 1> then
              begin
                  <anweisung 1a>
                  <anweisung 1b>
              end
else if <bedingung 2> then
              begin
                  <anweisung 2a>
                  <anweisung 2b>
              end
...
etwa 50 x ( else if <bedingungn> )
...
else if <bedingung n+1> then
              begin
                  <anweisung n+1a>   // ab hier finktionieren die Braekpoints nicht mehr
                  <anweisung n+1b>
              end
else if <bedingung n+2> then
              begin
                  <anweisung n+2a>
                  <anweisung n+2b>
              end
...
else if <bedingung n+m> then        // n+m = ca.100
              begin
                  <anweisung n+ma>
                  <anweisung n+mb>
              end

else begin
     end;

...
Egal was sich dahinter verbirgt, alle Anweisungen müßten potentiell erreichbar sein, also die Breakpoints rot bleiben.
Ob sie dann zur Laufzeit auch immer erreicht werden ist eine andere Sache.

Bei mir ist es verrückter weise so, daß eine <anweisung..a> blaubepunktet und die <anweisung..b> im gleichen BEGIN..END Bereich unbepunktet ist bzw. umgekehrt.
Oder, innerhalb eines BEGIN..END Bereiches bleibt eine <anweisung..>-zeile rot und die andere dunkelgrün.
Entweder beide rot oder beide grün, so sehe ich das.

Das wäre meine aktuelle Problemstelle,

Vielen Dank, wenn Du / Ihr etwas dazu wißt

E. B.

Treffnix 20. Okt 2005 15:33

Re: dunkelgrüner Breakpoint ?
 
Bei so einem Konstrukt wird das vermutlich an der Optimierung liegen. Übrigens: Optimierung bedeutet nicht, dass er das auch wirklich löscht. Es wird nur zu einem günstigeren Konstrukt umgestellt und ist deshalb oft nicht mehr debugbar, da es in deinem Quelltext keine echte Entsprechung des Maschinencodes mehr gibt, auf die der Debugger verweisen könnte. Haste das ganze mal mit abgeschalteter Optimierung versucht?

Oxmyx 20. Okt 2005 15:46

Re: dunkelgrüner Breakpoint ?
 
Zeig mal ein konkretes Quellcode-Beispiel, das bei dir nicht wie erhofft funktioniert. An deinem Pseudocode kann man so etwas nicht unbedingt erkennen.

chris_k 20. Okt 2005 16:16

Re: dunkelgrüner Breakpoint ?
 
Es wird nicht nur Code wegoptimiert der nicht erreichbar ist, sondern auch überflüssiger Code. Zur Verdeutlichung mal das folgende (zugegebenermaßen recht sinnlose) Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a,b:integer;
begin
  a:=1;
  b:=2;
  showmessage('a='+IntToStr(a));
end;
Die Zeile b:=2; ist nicht notwendig da b nie verwendet wird, deshalb wird sie wegoptimiert.

EccoBravo 20. Okt 2005 17:19

Re: dunkelgrüner Breakpoint ?
 
Das ist es ja eben, mein richtiger Code ist genauso wie der Pseudocode, keine Probleme ersichtlich, worüber der Optimizer stolpern könnt. den richtigen Code anzuhängen, würde Euch und die Seitre überfordern, daher nur ein Ausschnitt, der repitorisch wiederholt wird

Delphi-Quellcode:

   ...

   while (iStart < fmax) and (FeldNr<11) do
    begin
        addr:='';
        addr:=addr+IntToHex(buff1[aStart],2);
        addr:=addr+IntToHex(buff1[aStart+1],2);
        addr:=addr+' ';
        addr:=addr+IntToHex(buff1[aStart+2],2);
        addr:=addr+IntToHex(buff1[aStart+3],2);

        if addr='FEFF 00E0'     then begin
                                      if param in['a','p','f'] then begin
                                          j:=j+1;
                                      end;
                                      aStart:=aStart+8; lStart:=aStart+4; iStart:=aStart+8;
                                  end
        else if addr='0800 1600' then begin
                                      if param in['a'] then begin
                                          j:=j+1;
                                          Plan.Inhalt1:= Lesen(lStart,iStart,Lang);
                                      end
                                      else lang:= Laenge_bestimmen(lStart);
                                      aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                  end
        else if addr='0800 1800' then begin
                                      if param in['a'] then begin
                                          j:=j+1;
                                          Plan.Inhalt2:= Lesen(lStart,iStart,Lang);
                                      end
                                      else lang:= Laenge_bestimmen(lStart);
                                      aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                  end
        else if addr='0800 2000' then begin
                                      if param in['a','p'] then begin
                                          j:=j+1;
                                          Plan.Inhalt3:= Lesen(lStart,iStart,Lang);
                                      end
                                      else lang:= Laenge_bestimmen(lStart);
                                      aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                  end
        else if addr='0800 3000' then begin
                                      if param in['a','p'] then begin
                                          j:=j+1;
                                          Plan.Inhalt4:= Lesen(lStart,iStart,Lang);
                                      end
                                      else lang:= Laenge_bestimmen(lStart);
                                      aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                  end
        else if addr='0800 3010' then begin
                                      if param in['a','p'] then begin
                                          j:=j+1;
                                          Plan.Inhalt5:= Lesen(lStart,iStart,Lang);
                                      end
                                      else lang:= Laenge_bestimmen(lStart);
                                      aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                  end
        else if addr='0800 5000' then begin
                                      if param in['a'] then begin
                                          j:=j+1;
                                          Plan.Inhalt6:= Lesen(lStart,iStart,Lang);
                                       end
                                      else lang:= Laenge_bestimmen(lStart);
                                      aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                  end
        else if addr='0800 6000' then begin
                                      if param in['a','p'] then begin
                                          j:=j+1;
                                          Plan.Inhalt7:= Lesen(lStart,iStart,Lang);
                                      end
                                      else lang:= Laenge_bestimmen(lStart);
                                      aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                  end

   ...

   ...

   ...


       else if addr='0C30 5100' then begin
                                    if param in['a'] then begin
                                         j:=j+1;
                                         Feld[FeldNr].Inhalt1:= Lesen(lStart,iStart,Lang);
                                     end
                                     else lang:= Laenge_bestimmen(lStart);
                                     aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                end
       else if addr='0C30 4200' then begin
                                    if param in['a'] then begin
                                         j:=j+1;
                                         Feld[FeldNr].Inhalt2:= Lesen(lStart,iStart,Lang);
                                     end
                                     else lang:= Laenge_bestimmen(lStart);
                                     aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                end
       else if addr='0C30 6A00' then begin
                                    if param in['a'] then begin
                                         j:=j+1;
                                         Feld[FeldNr].Inhalt3:= Lesen(lStart,iStart,Lang);
                                     end
                                     else lang:= Laenge_bestimmen(lStart);
                                     aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                end
       else if addr='0C30 A000' then begin
                                    if param in['a'] then begin
                                         j:=j+1;
                                         Feld[FeldNr].Inhalt4:= Lesen(lStart,iStart,Lang);
                                     end
                                     else lang:= Laenge_bestimmen(lStart);
                                     aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                end
       else if addr='0C30 0A00' then begin
                                    if param in['a'] then begin
                                         j:=j+1;
                                         Feld[FeldNr].Inhalt5:= Lesen(lStart,iStart,Lang);
                                     end
                                     else lang:= Laenge_bestimmen(lStart);
                                     aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                end
       else if addr='0AC30 1800' then begin
                                    if param in['a'] then begin
                                         j:=j+1;
                                         Feld[FeldNr].Inhalt6:= Lesen(lStart,iStart,Lang);
                                     end
                                     else lang:= Laenge_bestimmen(lStart);
                                     aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                end
       else if addr='0AC30 2300' then begin
                                    if param in['a'] then begin
                                         j:=j+1;
                                         Feld[FeldNr].Inhalt7:= Lesen(lStart,iStart,Lang);
                                     end
                                     else lang:= Laenge_bestimmen(lStart);
                                     aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
                                end


       else begin
             if param in['a'] then begin
                 j:=j+1;
                 Feld[FeldNr].Inhalt8:= Lesen(lStart,iStart,Lang);
             end
             else lang:= Laenge_bestimmen(lStart);
             aStart:=aStart+8+lang; lStart:=aStart+4; iStart:=aStart+8;
       end;
 
   end;

   ...
Mit diesem Programm wird der Inhalt aus einem File herausgefiltert.
Es sind etwa 170 else if Sequenzen.
Die Variable j wird später als Zählergebnis gebraucht.
Ich hoffe, Ihr könnt damit was anfangen

Danke E. B.

Treffnix 20. Okt 2005 17:23

Re: dunkelgrüner Breakpoint ?
 
Es muss keine Probleme geben, damit optimiert wird. Es reicht, wenn sie einen besseren Weg kennt.
Es muss auch nicht immer ein fehlerhafter oder schlechter Code sein, wenn er wegoptimiert wird. In deinem Fall denke ich allerdings, dass ein case-Konstrukt besser wäre.

EccoBravo 20. Okt 2005 17:27

Re: dunkelgrüner Breakpoint ?
 
Danke aber Case geht nur bei ordinalen Typen, welcher addr nicht ist.

Gruß

E. B.

Treffnix 20. Okt 2005 17:50

Re: dunkelgrüner Breakpoint ?
 
Wenn ich das Richtig sehe sind das auch nur hexadezimale Zahlen als String verpackt.

Aber überhaupt mal zu den Funktionen. Seh ich das richtig, dass du überall haargenau das gleiche machst und sich nur der "Empfänger" für die lesen-Funktion ändert? Das ist aber auch etwas aufwändig. Kein Wunder, dass da die Compilermagic zuschlägt. Da solltest du dir ne Zuordnung zwischen addr und "Empfänger" überlegen, anhand derer du das richtige Ziel findest und dann nur an einer Stelle rechnen.

Brüggendiek 21. Okt 2005 00:06

Re: dunkelgrüner Breakpoint ?
 
Hallo EccoBravo!

Hast Du den fehlerhaft reagierenden Code vielleicht nicht direkt in Delphi eingetippt, sondern irgendwoher übernommen (Copy&Paste, Einlesen einer Fremddatei)?
Dann kann es sein, daß die Zeilenwechsel nicht korrekt dargestellt sind. Unter Windows muß das #$0D#$0A sein - also CR und LF. Andere Systeme kommen mit CR oder LF alleine aus. Die Delphi-IDE zeigt das dann korrekt an, aber Compiler und Debugger funktionieren nicht richtig.

Abhilfe: Die .PAS-Datei mal in Notpad einlesen und wieder abspeichern. Alternativ geht auch ein Mini-Programm, das die Datei in eine StringList einliest (LoadFromFile) und dann wieder speichert (SaveToFile).

Irgendwie verstehe ich nicht, daß bisher niemand da drauf gekommen ist - das Problem taucht doch mindestens zweimal pro Monat auf!

Gruß

Dietmar Brüggendiek

jim_raynor 21. Okt 2005 05:58

Re: dunkelgrüner Breakpoint ?
 
Zitat:

Zitat von EccoBravo
aber so ganz glaube ich das nicht, denn die blauen Punkte stehen nicht vor Kommentarzeilen, und END-Zeilen. Dafür stehen sie ganz willkürlich innerhalb von BEGIN...END-Bereichen (mal ja mal nicht) vor ausführbaren Zeilen.

Sorry, falsch ausgedrückt. Der blaue Punkt befindet sich nur bei Ausführbaren zeilen. Insofern passt es mit den Punkten zwischen begin...end ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr.

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