Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EAccessViolation im Projekt (https://www.delphipraxis.net/85906-eaccessviolation-im-projekt.html)

Z32 6. Feb 2007 18:32


EAccessViolation im Projekt
 
Hallo,

bin ratlos. Ich bekomme immer den Fehler "EAccessViolation" mit einer Zugriffsverletzung im meinem Programm. Wenn ich das Programm dann in Delphi ausführe, zeigt der mir immer die Stelle an, wo das Programm abgebrochen wurde und das ist immer in dem Project auf dem letzten "end."

Was jetzt meine Frage ist. Was hat das zu bedeuten, was ist falsch?

program Project1;

Delphi-Quellcode:
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3},
  Unit4 in 'Unit4.pas' {Form4},
  Unit5 in 'Unit5.pas' {Form5},
  Unit6 in 'Unit6.pas' {Form6},
  Unit7 in 'Unit7.pas' {Form7},
  Unit8 in 'Unit8.pas' {Form8};

{$R *.res}

begin
  Application.Initialize;
  Application.Title := 'MoneyMaker';
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm5, Form5);
  Application.CreateForm(TForm6, Form6);
  Application.CreateForm(TForm7, Form7);
  Application.CreateForm(TForm8, Form8);
  Application.Run;
end. {HIER IST DIE MAKIERTE ZEILE; ALSO DER FEHLER
Ich hoffe, dass mir jemand helfen kann...

Der_Unwissende 6. Feb 2007 18:35

Re: EAccessViolation im Projekt
 
Zitat:

Zitat von Z32
Ich bekomme immer den Fehler "EAccessViolation" mit einer Zugriffsverletzung im meinem Programm. Wenn ich das Programm dann in Delphi ausführe, zeigt der mir immer die Stelle an, wo das Programm abgebrochen wurde und das ist immer in dem Project auf dem letzten "end."

Was jetzt meine Frage ist. Was hat das zu bedeuten, was ist falsch?

Hi,
da deutest Du etwas falsch. Der Cursor steht auf dem letzten end., weil die vohergehende Zeile gerade ausgeführt wurde. Über den Sinn und Unsinn kann man sich natürlich streiten, jedenfalls tritt der Fehler schon im Application.Run auf. Wo genau der Fehler liegt kann Dir so keiner sagen, da natürlich keiner weiß was bei Dir passiert. Zudem sollte die DPR Datei eigentlich auch aut. erstellt und verwaltet werden!

Gruß Der Unwissende

mkinzler 6. Feb 2007 18:37

Re: EAccessViolation im Projekt
 
Im Projekt ist der Fehler nicht. Starte es mal im Debugger

Z32 6. Feb 2007 20:00

Re: EAccessViolation im Projekt
 
Aso, das heißt ich muss den Fehler in den Units suchen...

Aber ich habe da noch eine frage: Wie starte ich das den im debugger?

Mit der eingabeaufforderung, oder wie?

sirius 7. Feb 2007 11:52

Re: EAccessViolation im Projekt
 
Der fehler passiert häufig, wenn man die rücksprungaddresse im Stack überschrieben hat. Gern passiert das bei (dynamischen) arrays.

Debugger: F7, F8 + Breakpoints

MatthiasR 4. Nov 2008 08:08

Re: EAccessViolation im Projekt
 
Ich schließe mich hier einfach mal an.

Ein paar wenige unserer Kunden berichten uns an einer bestimmten Stelle in unserem Programm von einer Fehlermeldung, die auf eine EAccessViolation hindeutet ("Speicherzugriffsverletzung bei Adresse ... usw."). Bei uns im Haus tritt das natürlich nie auf, sodass man sich mit dem Debugger hätte ranmachen können. Nun ist die Frage, wie man dem Problem am besten zu Leibe rückt. Kann man die EAccessViolation irgendwie auswerten um auf die Stelle zu kommen (Unit + Codezeile), an der das ganze passiert? Wie sollten wir am besten vorgehen?

Bernhard Geyer 4. Nov 2008 08:12

Re: EAccessViolation im Projekt
 
Möglichkeit wäre per JCL (Jedi Code Library) + aktive Debuginfos sich einen Stacktrace beim auftreten einer unbehandelten Exception geben zu lassen.

Meflin 4. Nov 2008 08:32

Re: EAccessViolation im Projekt
 
Zitat:

Zitat von Infect
Ein paar wenige unserer Kunden berichten uns an einer bestimmten Stelle in unserem Programm von einer Fehlermeldung, die auf eine EAccessViolation hindeutet ("Speicherzugriffsverletzung bei Adresse ... usw."). Bei uns im Haus tritt das natürlich nie auf, sodass man sich mit dem Debugger hätte ranmachen können. Nun ist die Frage, wie man dem Problem am besten zu Leibe rückt. Kann man die EAccessViolation irgendwie auswerten um auf die Stelle zu kommen (Unit + Codezeile), an der das ganze passiert? Wie sollten wir am besten vorgehen?

Welche Delphi-Version habt ihr denn im Einsatz? Die neueren sind ja mit dem Remote Debugger ausgestattet, der wohl genau für solche Fälle konzipiert ist :)

spaxxn 4. Nov 2008 09:15

Re: EAccessViolation im Projekt
 
Bei Delphi 7 kannst man unter Projektoptionen->Linker eine Map-Datei zum Projekt erzeugen lassen. mit der fällt das Debuggen bei einem solchen Problem auf jeden Fall leichter...

Bei Delphi 2007-2009 müsste ich heute abend mal zu Hause schauen.

MatthiasR 4. Nov 2008 09:21

Re: EAccessViolation im Projekt
 
Wir haben noch Delphi 7 im Einsatz und bis auf absehbare Zeit wird sich da auch nichts dran ändern. Daher wirds eher nichts mit dem Remote-Debuggen. Außerdem braucht man da ja eine Internetverbindung zum Kunden (oder?) und die haben wir nicht.

@Bernhard: an welchen Bestandteil der JCL hast du da genau gedacht, der einem bei so etwas hilft? Kann ich mir der Stacktrace ähnlich wie bei Java vorstellen mit Klartext-Methoden- und Klassennamen? Wenn ja, wäre das natürlich ne tolle Sache. Kannst du mir etwas mehr dazu sagen, wie ich da vorgehen muss um das einzubauen (vielleicht kleines Codebeispiel?).

@spaxxn: was genau ist so eine Map-Datei und inwiefern hilft mir die weiter?

spaxxn 4. Nov 2008 09:24

Re: EAccessViolation im Projekt
 
In der Map-Datei erstellt dir ein "Speichermapping" des kompilierten Codes bereit gestellt.

So kann man sich über die Speicheradresse der Exception in der Map-Datei anschauen, welche Funktion/wlches Objekt den Fehler geworfen hat.

MatthiasR 4. Nov 2008 09:43

Re: EAccessViolation im Projekt
 
Zitat:

Zitat von spaxxn
In der Map-Datei erstellt dir ein "Speichermapping" des kompilierten Codes bereit gestellt.

So kann man sich über die Speicheradresse der Exception in der Map-Datei anschauen, welche Funktion/wlches Objekt den Fehler geworfen hat.

Höt sich doch schonmal ganz gut an. Ich habe das mal ausprobiert und mir mit
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  abc: TForm;
begin
  abc := nil;
  abc.Show;
end;
eine Speicherzugriffsverletzung erzeugt, die da lautet:
Zitat:

Zugriffsverletzung bei Adresse 004458A6 in Modul 'Project1.exe'. Lesen von Adresse 000002F4.
Wenn ich nun in der erzeugten Map-Datei (Stufe: detailliert) nach der Adresse 004458A6 suche, finde ich nichts. Bei der Adresse 000002F4 finde ich zwei mal folgende Zeile:
Zitat:

0001:000002F4 InterlockedDecrement
Nur, was soll mir die Zeile sagen, mit dem ich was anfangen könnte zur Fehlerfindung?

gkoeder 4. Nov 2008 09:50

Re: EAccessViolation im Projekt
 
Zitat:

Zitat von Infect
Kann man die EAccessViolation irgendwie auswerten um auf die Stelle zu kommen (Unit + Codezeile), an der das ganze passiert?

Für sowas setze ich Eurekalog ein (http://www.eurekalog.com). Eurekalog zeigt bei einem Fehler ausserhalb der IDE (also beim Kunden ...) ein detailliertes Fehlerprotokoll an (wo trat der Fehler auf, welche Zeile, welche Unit, etc.). Welche Infos der Kunde sehen soll, kann parametrisiert werden.

Gruß
Gerald

SirThornberry 4. Nov 2008 10:54

Re: EAccessViolation im Projekt
 
Wenn es um eine Zugriffsverleztung geht ist die vollständige Fehlermeldung sehr Hilfreich. Daraus ist dann ersichtlich ob es ein Schreib- oder Lesezugriff ist und anhand der Adresse auf die geschrieben wird bzw. von der gelesen wird kann man auch Rückschlüsse ziehen. Und zuletzt ist auch die Adresse an welcher der Fehler aufgetreten ist nicht uninteressant wenn man die Sourcen und das Binary hat.

MatthiasR 13. Nov 2008 10:54

Re: EAccessViolation im Projekt
 
Habe mir nun mal die Trial-Version von diesem Eurekalog angeschaut. Macht wirklich einen sehr ausgereiften Eindruck und dürfte uns beim Auffinden des Fehlers sehr behilflich sein. Ich denke, das werden wir uns zulegen, da es außerdem noch recht kostengünstig ist (299,- für ne Firmenlizenz).

SirThornberry 13. Nov 2008 11:12

Re: EAccessViolation im Projekt
 
Wie lautet nun eigentlich die genaue Fehlermeldung inklusive der Adressen?

EWeiss 13. Nov 2008 11:31

Re: EAccessViolation im Projekt
 
EAccessViolation bekommst du meistens dann wenn du stdcall vergessen hast.
Prüf das mal.

gruss Emil

MatthiasR 13. Nov 2008 13:44

Re: EAccessViolation im Projekt
 
Zitat:

Zitat von SirThornberry
Wie lautet nun eigentlich die genaue Fehlermeldung inklusive der Adressen?

Kann ich dir leider nicht sagen, weil wir die bisher nicht mitloggen, sondern lediglich am Telefon gesagt bekommen :shock: . Und da heißt es halt immer nur "Access Violation".

nahpets 13. Nov 2008 13:56

Re: EAccessViolation im Projekt
 
Hallo,

im Suchenmenü gibt es doch den Menüeintrag Laufzeitfehler suchen, kann der Dir nicht weiter helfen, dazu brauchst Du aus der Fehlermeldung allerdings die Fehleradresse.

MatthiasR 14. Nov 2008 08:31

Re: EAccessViolation im Projekt
 
Hab ich bisher noch gar nicht ausprobiert. Kannte diese Möglichkeit auch nicht. Wobei wir ja nun auch dieses EurekaLog einsetzen, um Laufzeitfehler aufzuspüren, das macht wirklich einen sehr ausgereiften Eindruck. Ich denke, damit werden wir der besagten Speicher-Zugriffsverletzung schon auf die Schliche kommen :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.

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