Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hilfe mit Access Violation (https://www.delphipraxis.net/113493-hilfe-mit-access-violation.html)

okoeller 8. Mai 2008 16:22


Hilfe mit Access Violation
 
Hallo

in einem anderen Forumsbeitrag von mirage228 habe ich folgendes gelesen:
Zitat:

Also die Fehlermeldung deutet auf eine Nullzeigerdereferenzierung hin, also irgendwo im Code versuchst du auf eine Variable zuzugreifen, die zu diesem Zeitpunkt = nil ist.
Wie kann ich beim Auftreten einer AV nun feststellen wer der Verursacher ist?
Das Programm an dem ich arbeite ist kein Dreizeiler, sondern hat einige 10.000 Zeilen mit mehr als 100 Klassen(verteilt auf 8 Packages).
In den letzten 2 Tagen habe ich versucht mit F7 und F8 durch den code zu gehen und den Fehler dingfest zu machen.
Bisher leider ohne Erfolg, da die Fehlermeldung erst mit dem Beenden der Application angezeigt wird.
Es scheint sich aber auf ein Package und den Aufruf eines bestimmten Fensters einschränken zu lassen.
Dieses Fenster besitzt mehrere in sich verschachtelte Frames von denen einige dynamisch erzeugt werden.

Kann hier jemand helfen?????

Vielen Dank
Oliver

Mikender 8. Mai 2008 16:39

Re: Hilfe mit Access Violation
 
Wie wärs mit Nach und nach Teile des Codes zu Kommentalieren
((meine zum Kommentar machen ( mit Strg + #)) Oder wie nennt man das ??)

Aber sonst fält mir dazu nix ein :wall: :wall: :wall:

Dezipaitor 8. Mai 2008 16:51

Re: Hilfe mit Access Violation
 
Nimm FastMM oder anderes Überwachungstool. Das nennt dir dann auch die Zeile.

FAlter 8. Mai 2008 16:58

Re: Hilfe mit Access Violation
 
Hi,

Breakpoint weit vor der stelle setzen und Variablen weit vorher kontrollieren, ob alles stimmt. So findet man es am Besten, denn eine AV tritt meistens an ganz anderer Stelle auf als wo man den Fehler gemacht hat. Also Breakpoint + durchsteppen.

Mfg
FAlter

bluesbear 8. Mai 2008 18:30

Re: Hilfe mit Access Violation
 
Das callstack-Fenster ist oft sehr hilfreich, um herauszufinden, wo man den Breakpoint setzen, und das Effsiebenen beginnen sollte.

okoeller 8. Mai 2008 19:14

Re: Hilfe mit Access Violation
 
Hallo Delphianer,

vielen Dank für Eure Tips.
Mal sehen was mich weiterbringt.

Was bedeuten bei Debuggen eigentlich die Marienkäfer an den Tabs der einzelnen Units?
Hat das noch mehr zu sagen als das sich der Debugger gerade in der mit Marienkäfer markierten Unit befindet.
Ich dachte zunächst das hier ein Fehler aufgetreten ist, hab aber dann in den Videos mit Nick Hodges gesehen das in seinen Beispielen auch die Marienkäfer zu sehen waren.


@ FAlter: Genau das hab ich die letzten beiden Tage versucht. Meist ist es aber so das die Variablen nichts anzeigen, weil sie wegoptimiert werden.


Oliver

Luckie 8. Mai 2008 19:19

Re: Hilfe mit Access Violation
 
Zitat:

Zitat von okoeller
@ FAlter: Genau das hab ich die letzten beiden Tage versucht. Meist ist es aber so das die Variablen nichts anzeigen, weil sie wegoptimiert werden.

Dann sind sie überflüssig.

Hast du schon alle Warnungen und Hinweise des Kompilers beseitigt?

FAlter 8. Mai 2008 19:21

Re: Hilfe mit Access Violation
 
Hi,

Zitat:

Zitat von okoeller
Meist ist es aber so das die Variablen nichts anzeigen, weil sie wegoptimiert werden.

Da hilft vorübergehendes Deaktivieren der Optimierung (Projektoptionen oder {$O-}). Wobei ich so etwas noch nie hatte. Wenn auf Variablen nicht zugegriffen werden konnte, gab es entweder ein Hinweis (zugewisener Wert nie genutzt/Variable deklariert, aber nicht verwendet) , oder man konnte vor dem ersten/nach dem letzten Auftauchen der Variable nicht zugreifen. Zwischendurch eigentlich immer.

Das sollten Marienkäfer sein? Ich dachte immer, das sind hässliche rote Wanzen. Marienkäfer sind doch viel schöner. :gruebel:

Mfg
FAlter

okoeller 8. Mai 2008 20:16

Re: Hilfe mit Access Violation
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Dezipaitor,

Zitat:

Zitat von Dezipaitor
Nimm FastMM oder anderes Überwachungstool. Das nennt dir dann auch die Zeile.

Also ich hab mir den FastMM runtergeladen und installiert, konnte mein Programm auch compilieren. Wie macht sich denn jetzt der FastMM genau bemerkbar, im Ereignisprotokoll??
Nachdem der Fehler aufgetreten ist wird mir jetzt die CPU Ansicht angezeigt, mit der ich nicht wirklich was anfangen kann!

Hier ein Ausschnitt aus dem Ereignisprotokoll:

....
1 Modul entladen: PluginManager.bpl. Prozess MdiApp.exe (1224)
2 Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EAccessViolation mit
Meldung 'Access violation at address 01171658. Read of address 01171658'. Prozess
MdiApp.exe (1224)


Was sagt mir denn jetzt die 1224 ??
Anbei noch ein Bild (Bild01.jpg)nach Beenden des Programms.

Oliver

OldGrumpy 9. Mai 2008 00:41

Re: Hilfe mit Access Violation
 
Also dem Screenshot nach rummst es vermutlich beim oder nach dem Entladen des PluginManager.bpl - wenn dort dann die Stelle klar ist an der es rummst, kann man im Projekt schauen, wo überall daran herummanipuliert wird, in vielen Fällen kommt man so zum Ziel. Übler wäre es natürlich, wenn Dein Fehler gar nicht direkt im Objekthandling zu suchen ist sondern durch überschriebenen Speicher o.ä. zustande kommt. Das lässt sich aus der Ferne aber nicht sagen und meine Glaskugel ist gerade beim Pfandleiher ;)

Gibts im PluginManager ein Finalize? Wenn ja, setz da mal einen Breakpoint direkt an den Anfang. Kommt die AV vor dem Breakpoint oder erst danach?

okoeller 9. Mai 2008 08:50

Re: Hilfe mit Access Violation
 
Hallo

der Fehler ist behoben.
Der PluginManager wollte ein Package entladen in welchem ein Frame nicht freigesetzt wurde.
Unter finally fehlte der Eintrag FfrmTH.Free.

Dabei wirft sich für mich die nächste Frage auf warum die Variable FfrmTH nicht von Delphi freigegeben wurde.
Um was genau kümmert sich Delphi und um welche Objekte muß ich mich kümmern?

Delphi-Quellcode:
procedure TfrmErstgespraech.ZeigeTexthilfeAn;
var
  TVL : TTextvorlage;
  Titel : string;
  FfrmTH : TFrmTexthilfe;
begin
  try
    TVL := TTextvorlage.Create;
    TVL.Produkt:= FD.Produkt;
    TVL.Kategorie:= pcErstgespraech.ActivePage.Caption;
    FfrmTH := TFrmTexthilfe.Erzeugen(TVL);
    FfrmTH.ShowModal;
    if FfrmTH.ModalResult = mrOK then
    begin
      ZeigeTextVorlagenAn(FfrmTH.Textvorlagen);
    end;

  finally
     FfrmTH.Free;
  end;
end;
Oliver

OldGrumpy 9. Mai 2008 10:46

Re: Hilfe mit Access Violation
 
Grobe Faustregel: Alles was Du selber erzeugst, musst Du auch wieder abräumen. Ausnahmen bestätigen die Regel (z.B. TObjectList, Childcontrols, etc.) :)

Tyrael Y. 9. Mai 2008 11:15

Re: Hilfe mit Access Violation
 
[OT]

Ein try...finally sollte folgendermassen aufgebaut sein

Delphi-Quellcode:
..
 MyObject := TSomeClass.Create;
 try
   ...
   ...
 finally
   MyObject.Free;
 end;
..

[/OT]

okoeller 9. Mai 2008 11:47

Re: Hilfe mit Access Violation
 
Zitat:

Zitat von OldGrumpy
Grobe Faustregel: Alles was Du selber erzeugst, musst Du auch wieder abräumen. Ausnahmen bestätigen die Regel (z.B. TObjectList, Childcontrols, etc.) :)

@OldGrumpy: Das heisst dann wohl dass ich auch TVL.Free setzen muss, da TTextvorlage eine von mir erstellte Klasse ist?

Delphi-Quellcode:
procedure TfrmErstgespraech.ZeigeTexthilfeAn;
var
  TVL : TTextvorlage;
  FfrmTH : TFrmTexthilfe;
begin
   TVL := TTextvorlage.Create;
  try
    TVL.Produkt:= FD.Produkt;
    TVL.Kategorie:= pcErstgespraech.ActivePage.Caption;
    FfrmTH := TFrmTexthilfe.Erzeugen(TVL);
    FfrmTH.ShowModal;
    if FfrmTH.ModalResult = mrOK then
    begin
      ZeigeTextVorlagenAn(FfrmTH.Textvorlagen);
    end;
  finally
     FfrmTH.Free;
  end;
  TVL.Free;
end;
Oliver

Tyrael Y. 9. Mai 2008 12:07

Re: Hilfe mit Access Violation
 
Ja du musst es freigeben.
Guck mal den Code unten an und vergleich mal mit deinem bitte.

So wäre der Umgang mit try...finally richtig.

Delphi-Quellcode:
procedure TfrmErstgespraech.ZeigeTexthilfeAn;
var
  TVL : TTextvorlage;
  FfrmTH : TFrmTexthilfe;
begin
  TVL := TTextvorlage.Create;
  try
    TVL.Produkt:= FD.Produkt;
    TVL.Kategorie:= pcErstgespraech.ActivePage.Caption;
    FfrmTH := TFrmTexthilfe.Erzeugen(TVL);
    try
      FfrmTH.ShowModal;
      if FfrmTH.ModalResult = mrOK then
      begin
        ZeigeTextVorlagenAn(FfrmTH.Textvorlagen);
      end;
    finally
      FfrmTH.Free;
    end;
  finally
    TVL.Free;
  end;
end;

SirThornberry 9. Mai 2008 12:36

Re: Hilfe mit Access Violation
 
Zitat:

Zitat von Mikender
...Aber sonst fält mir dazu nix ein :wall: :wall: :wall:

Könntest du solche Kommentaare zukünftig unterlassen? Das hat nichts mit Respekt und gegenseitiger Achtung voreinander zu tun. Wenn der Fragesteller alles wüsste, würde er hier nicht fragen.
Unwissenheit ist nichts schlimmes und sollte nicht mit Demütigung bestraft werden sondern durch ordentliche Hilfe in umgänglichen Formen gemindert werden.

DeddyH 9. Mai 2008 13:01

Re: Hilfe mit Access Violation
 
Jens, ich glaube, das hast Du falsch verstanden.
Zitat:

Wie wärs mit Nach und nach Teile des Codes zu Kommentalieren
((meine zum Kommentar machen ( mit Strg + #)) Oder wie nennt man das ??)

Aber sonst fält mir dazu nix ein :wall: :wall: :wall:
Ich denke, die Walls bezogen sich auf die Tatsache, dass sich der Postende ärgert, dass ihm außer Auskommentieren keine weiteren Ideen gekommen sind.

SirThornberry 9. Mai 2008 13:04

Re: Hilfe mit Access Violation
 
oh, wenn das so ist entschuldige ich mich für den Vorworf :oops:
Allerdings zeigt es dan man das ganze wohl durchaus auch missverstehen kann.

okoeller 9. Mai 2008 15:48

Re: Hilfe mit Access Violation
 
@ SirThornberry: hab das auch so verstanden wie DeddyH.

@Tyrael Y.:
O.K ich sehe den Unterschied, jetzt muß ich nur noch begreifen warum Dein Vorschlag richtiger ist.
Der finally-Block bedeutet doch das sein Inhalt immer ausgeführt wird.
Wenn ich nun beide Objekte(FfrmTH,TVL) vor dem schliessenden end der Prozedur freisetze und auf try verzichte, wird mir im Fehler-Fall eine Fehlermeldung angezeigt, bevor ich das Objekt wieder freisetzten kann.
Verwende ich dageben try ..finally wird der try-Block ausgeführt, aber bei einem Fehler das Objekt freigesetzt und keine Fehlermeldung angezeigt - auch wenn der Fehler in einem anderen Objekt auftritt.
Verstehe ich das so richtig?

Oliver

DeddyH 9. Mai 2008 15:53

Re: Hilfe mit Access Violation
 
Deshalb nennt man try-finally auch Ressourcenschutzblock. Ein finally wird immer durchlaufen, selbst bei einem exit-Befehl im Block.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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