Ich erhalte eine Zugriffsverletzung, wenn ich ein Formular in meiner Anwendung zu schließen. Es scheint erst dann zu passieren, wenn ich einige Male auf eine Datenbank zugreife, aber das scheint keinen Sinn zu ergeben.Zugriffsverletzung - wie finde ich die Ursache?
Ich habe durch verfolgt und setzen Output Nachrichten in allen verwandten OnDestroy() Methoden, aber die AV erscheint außerhalb meines Codes zu sein.
Dies ist der Text der Nachricht:
Zugriffsverletzung bei Adresse 00405F7C in Modul 'MySoopaApplication.exe'. Adresse lesen 00000008.
Wie finde ich wo in der Anwendung 00405F7C ist?
Welche Werkzeuge in Delphi 10.1 Berlin verfügbar sind mir dabei zu helfen?
Edit: hat ein bisschen mehr Info ... wenn Sie auf "Pause" die IDE nimmt mich immer an diesem Stück Code in GETMEM.INC:
@SmallPoolWasFull:
{Insert this as the first partially free pool for the block size}
mov ecx, TSmallBlockType[ebx].NextPartiallyFreePool
Weitere edit: na ja, ich den Schuldigen gefunden , obwohl ich nicht ehrlich sagen kann, dass die Debug-Tools mich dorthin gebracht haben - sie schienen nur anzuzeigen, dass es nicht in meinem Code war.
I-Code aus dem Netz benutzt hatte, die ich verwenden, um den Windows zu finden angemeldete Benutzer - das ist es:
function GetThisComputerName: string;
var
CompName: PChar;
maxlen: cardinal;
begin
maxlen := MAX_COMPUTERNAME_LENGTH +1;
GetMem(CompName, maxlen);
try
GetComputerName(CompName, maxlen);
Result := CompName;
finally
FreeMem(CompName);
end;
end;
, wenn ich den Code mit einem einfachen Ergebnis ersetzt hatte: ‚12345‘ = die AVs gestoppt. Ich habe nicht geändert, es zu diesem Code:
function GetThisComputerName: string;
var
nSize: DWord;
CompName: PChar;
begin
nSize := 1024;
GetMem(CompName, nSize);
try
GetComputerName(CompName, nSize);
Result := CompName;
finally
FreeMem(CompName);
end;
end;
, die als Bonus zu arbeiten und scheint, nicht AVs verursachen.
Danke für Ihre Hilfe, sehr geschätzt.
unter Extras | Optionen in der IDE zu Embarcadero Debuggers gehen | Sprachausnahmen und stellen Sie sicher, dass Bei Sprachausnahmen benachrichtigen aktiviert ist. Lassen Sie die Ausnahme passieren, und wechseln Sie zu Ansicht | Debug Windows | Call-Stack und Sie sollten in der Lage sein, genau zu sehen, wo es aufgetreten ist. Die Tatsache, dass es nach dem Datenbankzugriff auftritt, liegt wahrscheinlich daran, dass dadurch ein Objekt erstellt wird, das den AV erzeugt, wenn er zerstört wird. Möglicherweise weil es zweimal Free() ed ist. – MartynA
@MartynA: Ich denke, das könnte eine Antwort sein. –
Verwenden Sie madExcept oder ähnliche –