Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung ausfindig machen (https://www.delphipraxis.net/80894-zugriffsverletzung-ausfindig-machen.html)

hirnstroem 17. Nov 2006 06:39


Zugriffsverletzung ausfindig machen
 
'loha Folks,

immer wieder taucht folgende Fehlermeldung auf, deren Ursprung mir sehr schleierhaft ist:

Zugriffsverletzung bei Adresse 0056155 in Modul 'FACTS.exe'. Lesen von Adresse 00000000.

Kann ich irgendwie auf schnellem Weg ausfindig machen, woher diese Fehlermeldung stammt, bzw. weshalb sie ausgelöst wird?

Einzelne Anweisungen abzuarbeiten (F7) würde in stunden- wenn nicht sogar tagelangem "die-selbe-Taste-Drücken" enden.

Trotz der Fehlermeldung funktionieren sämtliche Abläufe fehlerlos.

Grüsse
hirnstroem

mkinzler 17. Nov 2006 06:41

Re: Zugriffsverletzung ausfindig machen
 
Dugreifst auf eine nicht Intantieertes Objekt zu.

hsg 17. Nov 2006 06:52

Re: Zugriffsverletzung ausfindig machen
 
Und um die Stelle zu finden benutzt man Tools wie MadExpert oder Eurekalog.
Dann bekommst du einen CallStack und kannst sehen, wo die Zugriffsverletzung aufgetreten ist.

alzaimar 17. Nov 2006 06:52

Re: Zugriffsverletzung ausfindig machen
 
Und einfach mal in den Debugger-Optionen ankreuzen, das Delphi bei einer Exception anhalten soll. Dann zeigt die IDE dir sogar genau die Zeile, wo das auftritt.
[edit] und über die Debugger-Fenster->Call Stack siehst Du dann auch eventuell den Grund dafür[/edit]

hirnstroem 17. Nov 2006 07:20

Re: Zugriffsverletzung ausfindig machen
 
madExcept habe ich bereits versucht, wenn es aktiv ist, tritt der Fehler gar nicht mehr auf. Dies ist natürlich nicht wirklich zufriedenstellend.

Dass der Debugger auf Exceptions reagieren und die Applikation anhalten soll, weiss er.

Werde mir Eurekalog noch zu Gemüte führen.

Danke und Grüsse
hirnstroem

hirnstroem 17. Nov 2006 07:33

Re: Zugriffsverletzung ausfindig machen
 
Den Ort der Entstehung habe ich gefunden, weshalb der Code Fehler ausspuckt bleibt mir hingegen noch immer ein Rätsel:

Delphi-Quellcode:
function HexStrToInt(str: string): integer;
var
  ColorInteger: integer;
  Einer, Zehner: Integer;
  ColorString: string;
  HexString: String;
begin
    Einer:=0;
    Zehner:=0;
    HexString:=str;
    if Length(HexString)=2 then
    begin
      try ColorString:=copy(HexString,length(HexString)-1,2); except end;

      if ColorString[1] in ['0'..'9'] then Zehner:= Ord(ColorString[1]) - 48
      else if ColorString[1] in ['A'..'F'] then Zehner:= Ord(ColorString[1]) - 55;

      if ColorString[2] in ['0'..'9'] then Einer:= Ord(ColorString[2]) - 48
      else if ColorString[2] in ['A'..'F'] then Einer:= Ord(ColorString[2]) - 55;
    end
    else     // length =1
    begin
      try ColorString:=copy(HexString,length(HexString),1); except end;
      Zehner:=0;
      if ColorString[1] in ['0'..'9'] then Einer:= Ord(ColorString[1]) - 48 // hier tritt der Fehler auf
      else if ColorString[1] in ['A'..'F'] then Einer:= Ord(ColorString[1]) - 55;
    end;
    ColorInteger:=16*Zehner+Einer;
    Result:=ColorInteger;
end;

ste_ett 17. Nov 2006 07:35

Re: Zugriffsverletzung ausfindig machen
 
Evtl. ist der String leer.

hirnstroem 17. Nov 2006 07:39

Re: Zugriffsverletzung ausfindig machen
 
Möglich wärs, habe die entsprechende Stelle jetzt einfach mit einen try except Block verpackt, dann passt das schon.

hsg 17. Nov 2006 07:56

Re: Zugriffsverletzung ausfindig machen
 
Zitat:

Zitat von hirnstroem
Möglich wärs, habe die entsprechende Stelle jetzt einfach mit einen try except Block verpackt, dann passt das schon.

Nein passt nicht! Das Copy in einem Try-Except Block zu verpacken reicht nicht, du musst dann schon die entsprechenden Zugriffe auf dein Colorstring kapseln. Besser wäre es aber an dieser Stelle alles noch mal mit einem
Delphi-Quellcode:
if Length( ColorString) = 1 then begin
....
end;
abzufangen. Zugriffsverletzungen müssen nicht sein!

Gruß
Jörg

Hawkeye219 17. Nov 2006 10:00

Re: Zugriffsverletzung ausfindig machen
 
Vielleicht kann man den Fehler auch anders umgehen:

Delphi-Quellcode:
Value := StrToIntDef('$' + str, 0);
Oder übersehe ich da etwas?

Gruß Hawkeye


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