Это походит на самую простую вещь в мире, и я готов вытащить волосы по ней.
У меня есть единица, которая похожа на это;
Unit myUnit;
// ...
//normal declarations
//...
Public
//bunch of procedures including
Procedure myProcedure;
const
//bunch of constants
var
//bunch of vars including
myCounter:integer;
Implementation
Uses //(all my uses)
// All of my procedures including
Procedure myProcedure;
try
// load items from file to TListBox - this all works
except
on EReadError do begin
// handle exception
end;
end; //try
myCounter:=0; // <-- ACCESS VIOLATION HERE
while myCounter //...etc
Это - простое присвоение переменной, и я понятия не имею, почему это делает это. Я попытался объявить переменную, локальную для единицы, для процедуры, глобально - неважно, где я пытаюсь сделать это, я не могу присвоить значение нуля к целому числу, объявленному нигде, в рамках этой процедуры без нее бросающий нарушение прав доступа. Я полностью озадачен.
Я называю процедуру из обработчика кнопок OnClick из той же единицы, но неважно где я звоню, это от него выдает исключение. Сумасшедшая вещь состоит в том, что я делаю ту же самую вещь в дюжине других мест в единицах на всем протяжении программы без проблем. Почему здесь? Я в общей сумме убытков.
Чтение адреса 00000008
означает, что вы читаете переменную со смещением 8 байтов от указателя nil . Это совершенно не соответствует тому, что вы пытаетесь здесь сделать, поскольку вы пишете, а не читаете, и вы пишете константу, а не переменную, прочитанную откуда-то.
Вы уверены, что именно эта строка вызывает исключение? Вы поставили точку останова на этой строке? Вы пробовали переместить эту строку в начало процедуры?
Трудно быть уверенным без вашего реального кода передо мной, но если бы мне пришлось угадывать, я бы сказал, что строка перед ] это вызывает исключение, а затем указатель инструкции уже увеличился, поэтому Delphi выделяет следующую строку.
Вы используете операторы with и смотрите на другой myCounter?
Некоторая часть вашего кода записывается в память, которую не следует, или освобождает, пока не следует, и это случайно приводит к AV при доступе к этому конкретная локальная переменная?
Назначение myCounter: = 0, вызывающее нарушение прав доступа, предполагает, что либо сегмент данных, в котором хранятся глобальные переменные, был удален из памяти, либо регистры закрыты в вашей подпрограмме myProcedure.
Используйте представление CPU, чтобы увидеть, какие регистры используются для доступа к глобальной переменной, а затем перейдите оттуда в обратном направлении, чтобы увидеть, где эти регистры не работают.
Переместите MyCounter в начало списка переменных и посмотрите, происходит ли это по-прежнему. Если проблема исчезнет, посмотрите на объявленные выше переменные там, где они есть сейчас - вы можете найти что-нибудь интересное, например, массив, который выходит за пределы своей границы.
Я не думаю, что ваша ошибка означает что-то вроде того, что похоже. Когда вы получаете нарушение прав доступа от такого фрагмента кода, который не имеет разумного способа вызвать нарушение прав доступа, вы каким-то образом смотрите на разрушенную память.
Просмотрите проблемный код в окне ЦП и посмотрите, что происходит на самом деле.