Results 1 to 8 of 8

Thread: Oplossen foutmelding

  1. #1

    Oplossen foutmelding

    Wat is de beste aanpak om de oorzaak van onderstaande foutmelding te achterhalen?
    Wegens het 'gebrek aan ervaring' weet ik niet juist hoe ik dit moet aanpakken.

    Alvast dank.
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	Unit2.jpg 
Views:	351 
Size:	12.8 KB 
ID:	6654  

  2. #2
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Welke Delphi versie gebruik je? Ik herinner me in Delphi 7 dat als je eerst F7 drukt om het project in de debugger te starten, je er bij 'Find' een 'Search Error' optie bij kreeg. Als je daar naar '00407676' opzoekt zet hij de cursor in de code van dat adres. Als er intussen niets is veranderd in de code. En als het wel een adres in je code is (want soms is het iets dieper in de Windows code, maar dan begint het meestal met iets anders dan 004...)

    Bij een Access violation weet je het soms ook aan het tweede getal. Als het "00000000" is of dicht in de buurt, zoals hier, is het waarschijnlijk dat je een object-referentie probeert te gebruiken, terwijl die eigenlijk nog op nil staat.

  3. #3
    Ik gebruik XE5 ...

  4. #4
    Als je vanuit Delphi het programma start, dan kan het helpen om 'Notify on language exceptions' aan te zetten. Dat vinkje zit ergens diep weggestopt onder Tools -> Options -> Debugger options, maar misschien is het ook wel te vinden in IDE Insights (Druk op Ctrl+. en typ 'language exceptions').

    Als je die optie aan hebt staan, heb je de mogelijkheid om de debugger te laten stoppen op het moment van een exception. Helemaal ideaal is dat niet, want de exception is dan al gegooid, en het is op dat moment niet goed meer mogelijk om de waarden van variabelen te inspecteren. Niettemin heb je wel een aanknopingspunt voor het moment en de plaats waarop de exception plaatsvindt. Daar kun je dan weer een breakpoint zetten en de applicatie nog een keer runnen om te kijken wat er nou precies gebeurt. Bovendien heb je ook de 'call stack' beschikbaar (één van de debugger-schermen die je kunt openen). Als de exception erg diep zit, in een algemene functie, dan zegt het je misschien nog niet zo veel, maar in de call stack kun je zien via welke aanroepen je op dat punt bent aanbeland. Dat is een heel praktisch aanknopingspunt om te zien waar het mis ging.

    Het is namelijk wel het handigste als je het zelf uitzoekt. Deze fout kan namelijk van alles betekenen, maar meestal heeft het te maken met een object dat gebruikt wordt terwijl het niet meer bestaat of nog niet bestaat. Bijvoorbeeld zo:
    Delphi Code:
    1. var
    2.   o: TEdit;
    3. begin
    4.   // o heeft geen waarde gekregen. Het is nog een 'toevallige pointer'.
    5.   o.Text := 'Hallo wereld'; // De kans is groot dat dit een access violation geeft.
    6. end;
    1+1=b

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Bij een AV geldt in 99,9% van de gevallen:
    • Is het een laag getal (bijv. 00000012), dan wordt er een object aangesproken dat nog niet bestaat.
      Delphi Code:
      1. Var
      2.   O : TMyObject;
      3. Begin
      4.   O.MyProperty := 'Test'; // <<< Lage AV
      5.   O := TMyObject.Create;
      6.   Try
      7.     ShowMessage(O.MyProperty);
      8.   Finally
      9.     O.Free;
      10.   End;
      11. End;
    • Is het een hoog getal (bijv. 7CDE1234), dan wordt er een object aangesproken dat niet meer bestaat.
      Delphi Code:
      1. Var
      2.   O : TMyObject;
      3. Begin
      4.   O := TMyObject.Create;
      5.   Try
      6.     O.MyProperty := 'Test';
      7.   Finally
      8.     O.Free;
      9.   End;
      10.   ShowMessage(O.MyProperty); // <<< Hoge AV
      11. End;

    Dan heb je nog "Read of address" en "Write of address":
    • Het eerste voorbeeld zal een "Write of address" geven: je schrijft iets naar een property van een object (dat niet, of niet meer, bestaat)
    • Het tweede voorbeeld zal een "Read of address" geven: je leest iets uit een property van een object (dat niet, of niet meer, bestaat)


    Let wel: dit geldt natuurlijk alleen voor de verwijzing (de variabele "O" in bovenstaande voorbeelden).
    Je zult ook een (lage) AV krijgen als je dit doet:
    Delphi Code:
    1. Var
    2.   O : TMyObject;
    3. Begin
    4.   O := TMyObject.Create;
    5.   Try
    6.     O.MyProperty := 'Test';
    7.     O := Nil;
    8.     ShowMessage(O.MyProperty); // <<< Lage AV
    9.   Finally
    10.     O.Free;
    11.   End;
    12. End;
    Je hebt immers de verwijzing naar het object Nil gemaakt, maar het object zelf bestaat gewoon nog
    (alleen kun je "Er nooit meer bij"), wat uiteindelijk resulteert in memory-leaks.

    Merk overigens op dat O.Free niet voor problemen zorgt: bij Free wordt er eerst gekeken of het object Nil
    is en als dat niet zo is, dan wordt dit object daadwerkelijk vrijgemaakt en opgeruimd; is de variabele al wel
    Nil, dan doet de code niets en gaat gewoon verder.

    Greetz,

    Peter.
    Last edited by VideoRipper; 01-Jun-14 at 01:16.
    TMemoryLeak.Create(Nil);

  6. #6
    Kleine nuance: Is het een laag getal, dan is het meestal een object dat wordt aangesproken terwijl de pointer nil is. Dat kan zijn als de objectvariabele expliciet nil is gemaakt omdat het een field is, of hij door FreeAndNil is gehaald. Is het een hoog getal, dan is het vaak een ongeldige niet-nil pointer. Dat kan zijn omdat het een lokale objectvariabele *) is die niet impliciet nil gemaakt is, of omdat het een bestaande objectinstantie was, maar het object is vrijgegeven zonder dat de pointer nil is gemaakt.

    *) Probeer je eerste snippet maar eens. Waar '// <<< Lage AV' staat, zul je een 'hoge' krijgen.
    1+1=b

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik was nog niet helemaal klaar met m'n verhaal Jos, maar bedankt.
    TMemoryLeak.Create(Nil);

  8. #8
    Het eerste stuk zag er al zo klaar uit. Ik dacht, ik reageer alvast. (Het stuk over de lage/hoge AV in je eerste stuk code is nog steeds van toepassing trouwens, of komt er nog een wijziging op je verhaal? )
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •