PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Delphi] Access Violation und Debbuger-Probleme


Kabelsalat
2006-06-07, 01:15:41
Hallo,

Ich stehe momentan mit dem Delphi-Debugger ein wenig auf Kriegsfuß:

-> Bei beinahe jedem Schritt, den ich im Debugger vornehme quitiert Delphi mit folgender Meldung: Benachrichtigung über Debugger-Problem - In Projekt [...] trat ein Problem mit folgender Meldung auf: 'access violation at <address>: access of address <address>'. Prozess angehalten. Mit einzelne Anweisung oder Start fortsetzen.

Nun kann ich mit der Meldung rein garnichts anfangen, außerdem kann sie eigentlich garnicht mit Programmierfehlern meinerseits in Verbindung stehen, da sie nach nahezu jedem Schritt, dem ich im Debugger vollziehe erscheint - Debuggen macht so definitiv keinen Spaß, da ich das Fenster jedes mal wegklicken muss, bevor es weitergehen kann.

-> An einer Stelle kommt es tatsächlich zu einer Access Violation - leider für mich in keinster Weise nachvollziehbar:


constructor TValueToken.Create(token: string);
var
FormatSettings: TFormatSettings;
begin
if Length(token) = 0 then
raise EArgumentNullException.Create('token');

if IsKnownConstant(token) then Create(GetConstantValue(token))
else
begin
//. will be always used as seperator
FormatSettings.DecimalSeparator := '.';

// might fail
Create(StrToFloat(token, FormatSettings));
end;
end;

constructor TValueToken.Create(token: extended);
begin
_Value := token;
end;


Hier ein Auszug aus dem Stacktrace:
TValueToken.Create('2') //die IF-Abfrage ist false, somit wird der Konstruktor bis zum Kommentar might fail durchlaufen
TValueToken.Create(2)

Jetzt springt er wieder zurück - nun steht im Stacktrace aber
TValueToken.Create('') anstelle von TValueToken.Create('2'). Anschließend lande ich bei Verwendung von Einzelschritten im CPU-Fenster und es dauert nicht mehr lange bis die Access Violation auftritt - bloß warum? Was ist an dem Code falsch?

Danke für eure Hilfe

Kabelsalat

Kabelsalat
2006-06-07, 02:35:40
Warum funktioniert der Code, wenn ich ihn wie folgt abändere:


constructor TValueToken.Create(token: string);
var
FormatSettings: TFormatSettings;
begin
//. will be always used as seperator
FormatSettings.DecimalSeparator := '.';

// klappt
_Value := StrToFloat(token, FormatSettings);
end;


Sobald er so aussieht, kommt es bei der Zuweisung (_Value := [...]) zu einer AccessViolation.


constructor TValueToken.Create(token: string);
var
FormatSettings: TFormatSettings;
begin
if Length(token) = 0 then raise EArgumentNullException.Create('token');

//. will be always used as seperator
FormatSettings.DecimalSeparator := '.';

// Access Violation
_Value := StrToFloat(token, FormatSettings);
end;
end;


Das hier funktioniert hingegen wieder:


constructor TValueToken.Create(token: string);
var
FormatSettings: TFormatSettings;
begin
raise EArgumentNullException.Create('token');

//. will be always used as seperator
FormatSettings.DecimalSeparator := '.';

// klappt / bzw. wird nicht erreicht
_Value := StrToFloat(token, FormatSettings);
end;
end;


Bin ich einfach nur zu Müde, oder gleich ganz auf den Kopf gefallen? Was zur Hölle stimmt da nicht?

Kabelsalat
2006-06-07, 10:02:44
Komisch, der Fehler tritt anscheinend nur auf, wenn ich den Debugger verwende. Nun habe ich noch ein kleines Test-Programm geschriben. Dort mache ich nichts anderes als


try
Test := TValueToken.Create('2');
Label1.Caption := Test.ToString();
except
on E: Exception do Label1.Caption := E.Message;
end;


Sowohl unter Delphi 7 als auch Delphi 2005 bekomme ich diese ominösen Debugger-Problem Benachrichtigungen, wenn ich den Code Schrittweise abarteite. Außerdem zeigt mir Label1 eine AccessViolation Exception. Lasse ich den Code jedoch am Stück durchlaufen bzw. springe ich nicht in den Konstruktor von TValueToken, funktioniert das Testprogrämmchen ohne Murren und Label1 zeigt 2 an...

... wie soll man in einer solchen Situation Debuggen? Kennt ihr so ein verhalten?

PS: Bereichs- und Überlaufsüberprüfung sind aktiv.

Kabelsalat
2006-06-07, 13:12:44
Durch meiden der betroffenen Konstruktoren im Debugger und ignorieren der immer wieder auftauchenden Warnmeldungen habe ich den wahren Fehler (welcher auch außerhalb des Debuggers auftrat) endlich finden können: Ich habe vergessen eine Variable zu initialisieren.