![]() |
Hilfe mit Access Violation
Hallo
in einem anderen Forumsbeitrag von mirage228 habe ich folgendes gelesen: Zitat:
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 |
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: |
Re: Hilfe mit Access Violation
Nimm FastMM oder anderes Überwachungstool. Das nennt dir dann auch die Zeile.
|
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 |
Re: Hilfe mit Access Violation
Das callstack-Fenster ist oft sehr hilfreich, um herauszufinden, wo man den Breakpoint setzen, und das Effsiebenen beginnen sollte.
|
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 |
Re: Hilfe mit Access Violation
Zitat:
Hast du schon alle Warnungen und Hinweise des Kompilers beseitigt? |
Re: Hilfe mit Access Violation
Hi,
Zitat:
Das sollten Marienkäfer sein? Ich dachte immer, das sind hässliche rote Wanzen. Marienkäfer sind doch viel schöner. :gruebel: Mfg FAlter |
Re: Hilfe mit Access Violation
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Dezipaitor,
Zitat:
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 |
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? |
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:
Oliver
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; |
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.) :)
|
Re: Hilfe mit Access Violation
[OT]
Ein try...finally sollte folgendermassen aufgebaut sein
Delphi-Quellcode:
..
MyObject := TSomeClass.Create; try ... ... finally MyObject.Free; end; .. [/OT] |
Re: Hilfe mit Access Violation
Zitat:
Delphi-Quellcode:
Oliver
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; |
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; |
Re: Hilfe mit Access Violation
Zitat:
Unwissenheit ist nichts schlimmes und sollte nicht mit Demütigung bestraft werden sondern durch ordentliche Hilfe in umgänglichen Formen gemindert werden. |
Re: Hilfe mit Access Violation
Jens, ich glaube, das hast Du falsch verstanden.
Zitat:
|
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. |
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 |
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