AGB  ·  Datenschutz  ·  Impressum  







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

Debuggen einer Schleife

Ein Thema von MrMooed · begonnen am 16. Jan 2014 · letzter Beitrag vom 17. Jan 2014
Antwort Antwort
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#1

Debuggen einer Schleife

  Alt 16. Jan 2014, 21:08
Guten Abend DPler,

langsam glaube ich, dass mich Delphi trollen will.
Innerhalb einer Schleife kommt es regelmäßig zu einer AV. Jedoch ist das komische, dass sie immer an einer anderen Stelle auftritt. Mal nach der 10.000 Iteration, mal "erst" nach der 14.000

Mit einigen try-except-Blöcken konnte ich nun nachvollziehen, dass es *scheinbar* an dem Constructor eines Objekts liegt.
Delphi-Quellcode:
type
FeldArray1D = Array of TFeld;
var
folgeZustand, Zustand: TStack;
aArray: FeldArray1D
Feld: TFeld;
begin
for y:=0 to High( aArray ) do
      try
        folgeZustand.push( TZustand.create( without(aArray, y), Feld, TZustand( Zustand.top ) ) );
      except
        showmessage('Fehler bei Zustand.create'); // Wird ausgelöst
      end;
end;
Nur das (für mich) Komische ist, dass der try-except-Block in dem constructor nicht ausgelöst wird

Delphi-Quellcode:
constructor TZustand.create(const pBrennt: FeldArray1D; const pGeloescht: TFeld;
  const pVorgaenger: TZustand);
begin
  try
  lVerbrannt := pBrennt;
  fGeloescht := pGeloescht;
  zVorgaenger := pVorgaenger;
  except
    showmessage('Fehler in create'); // Keine Reaktion
  end;
end;
Kann es evtl. sein, dass nur eine begrenzte Anzahl an Objekten erstellt werden kann ? Das ganze wird wie gesagt mehrere Tausend Mal aufgerufen.
Oder gibt es einen ganz simplen Trick, mit dem ich per debugger an das Problem herangehen kann ? Denn wenn das ganze mal wieder crashed, kommt nur die AV-Meldung und das CPU-Fenster öffnet sich - nicht die gecrashte Quellcodezeile
Gruß,
MrMooed
"Unsere Luft hat einen Vorteil: Man sieht was man einatmet" - Ein Chinese
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Debuggen einer Schleife

  Alt 16. Jan 2014, 21:45
Der Fehler liegt offensichtlich nicht im Konstruktor, sondern woanders, deshalb hilft dir auch der Try-Except-Block dort nichts. Vermutlich zerschießt dir irgendwas den Speicher oder es wird auf eine Struktur zugegriffen, die schon freigegeben wurde. Mehr kann man dazu nicht sagen, ohne den kompletten Source-Code zu haben.

Wie viele Objekte man anlegen kann ist nur durch den Arbeitsspeicher begrenzt. Aber wenn der voll ist, dann kommt keine AV, sondern eine andere Exception, deren genauen Namen ich vergessen habe.

Im Zweifelsfall debugge ich solche Fehler, indem ich so lange alles auskommentiere, bis der Fehler nicht mehr auftritt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#3

AW: Debuggen einer Schleife

  Alt 16. Jan 2014, 22:02
Das ist ein typisches Einsatzgebiet für FastMM. Das sagt dir im FullDebugMode evtl. sofort wo das Problem liegt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#4

AW: Debuggen einer Schleife

  Alt 16. Jan 2014, 22:02
Wie viele Objekte man anlegen kann ist nur durch den Arbeitsspeicher begrenzt. Aber wenn der voll ist, dann kommt keine AV, sondern eine andere Exception, deren genauen Namen ich vergessen habe.
EOutOfMemory
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Debuggen einer Schleife

  Alt 17. Jan 2014, 05:23
Zitat:
Delphi-Quellcode:
try
  ...
except
  ShowMessage('nichtssagender Text');
end;
Sowas liebe ich immer.
Delphi-Quellcode:
try
  ...
except
  on E: Exception do begin
    E.Message := E.ClassName + ' in Xyz: ' + E.Message; // hier kann man z.B. auch den Index der Schleife erwähnen
    raise; // oder notfalls ShowException(E, nil); und Dergleichen
  end;
end;
Es gibt auch noch Dinge wie EurekaLog und Co., welche beim Suchen der Fehler helfen.

Wenn sich der Fehler absolut nicht finden lässt, dann kann man es auch mal so versuchen.
Delphi-Quellcode:
try
  // mach was
except
  on E: Exception do begin
    ShowException(E, nil); // <<<<<< hier ein Haltepunkt hin
    // mach es nochmal (hoffentlich tritt der Fehler nochmal auf und man kann sich dabei langsam hindurchdebuggen)
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Debuggen einer Schleife

  Alt 17. Jan 2014, 06:23
Delphi-Quellcode:
...
 for y:=0 to High(aArray) do
    folgeZustand.push
      (
       TZustand.create
         (
          without(aArray, y),
          Feld,
          TZustand(Zustand.top) /// <<---- ist 'Zustand' instantiiert?
         )
      );
  end;
Und wie ich Bandwurmcode hasse (schlecht lesbar, fehlerbehaftet, buäh), also schreib das mal übersichtlicher und formatiere deinen Code nächstes Mal zumindest ansatzweise, danke.

Delphi-Quellcode:
type
  FeldArray1D = Array of TFeld;

var
  folgeZustand, Zustand, zustandTop: TStack;
  aArray, subArray: FeldArray1D
  Feld: TFeld;

begin
  zustandTop := TZustand(Zustand.top); // Einmal vor der Schleife gemerkt, reicht.
  for y:=0 to High(aArray) do begin
    subArray := Without(aArray,y);
    neuerZustand := TZustand.create(subArray, Feld, zustandTop);
    folgeZustand.push(neuerZustand);
  end;
end;
Vielleicht ist das ja nun besser lesbar. Und wenn Zustand tatsächlich undefiniert ist (vielleicht sollte das ja eigentlich 'folgeZustand.Top' heißen, dann hättest Du auch deinen Fehler.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Debuggen einer Schleife

  Alt 17. Jan 2014, 09:46
Zitat:
Einmal vor der Schleife gemerkt, reicht
Nur wenn sich der Wert innerhalb der Schleife nicht verändert.
Aber hier weiß ja keiner was Zustand, Zustand.Top oder Without eigentlich machen.

Allerdings ist das zum Debuggen grunstäzlich erstmal genau richtig gedacht.
- So kann man eventuell mitbekommen wo, in der Schlange, es nun genu knallt.
- kann auch jeden Teil auch mit eigenen Try-Excepts testweise umgeben
- und vorallem kann man die Rückgabewerte testweise mal prüfen
- - if Assigned
- - über eine Haltepunkt-Bedingung
- - kann sich im Except den wert der zwischengespeicherten Rückgaben ansehn
- - usw.
Ein Therapeut entspricht 1024 Gigapeut.
  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 21:32 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