![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как бороться с Access violation? [D7, WinXP]
cvg © (2004-11-11 10:49:00)Hi All! Subj. Прога иногда затыкакется, выкидывая сообщения такого вот типа: "Project abc.exe raised exception class EAccessViolation with message 'Access violation at address 00401C7A in module 'abc.exe'. Process stopped. Use stop or Run to continue." И как же с этим делом бороться?
Семен Сорокин (2004-11-11 17:18:00) [1]cvg (11.11.04 17:04) [47]
Все идет к [1]
:))
cvg (2004-11-11 17:04:00) [2]Ну так пожалей хоть людей, которым придется жить в доме, управдом которого абсолютно не бреет в указателях!
cvg (2004-11-11 17:04:00) [3]Ну так аожалей хоть людей, которым придется жить в доме, управдом которого абсолютно не бреет в указателях!
Amoeba (2004-11-11 16:56:00) [4]
> cvg (11.11.04 16:55) [44]
> Ага, а ты в таком доме жить захочешь? :о)
Не хотелось бы!
cvg (2004-11-11 16:55:00) [5]Ага, а ты в таком доме жить захочешь? :о)
Amoeba (2004-11-11 16:50:00) [6]
> ну ломает меня всякие там указатели изучать
Нечего тогда в программирование лезть. Ступай в управдомы.
cvg (2004-11-11 16:48:00) [7]Да ладно вам материться! -- ну ломает меня всякие там указатели изучать. А вот icWasya'е спасибо -- причина действительно может быть в этом. Ладно, поищу...
icWasya (2004-11-11 16:12:00) [8]Ну на вскидку - если ошибка возникает в GetMem.inc - то скорее всего имеет место запись за границу массива.
Например
var
X:Array of integer;
SetLength(X,10);
X[12]:=0;
X[-3]:=10;
X:=Nil; // караул
Rem (2004-11-11 16:05:00) [9]cvg (11.11.04 15:38) [38]
n := 0;
n.prev := p;
После такого перла я почти согласен с
"переквалифицируйся в кого угодно, хоть управдомы, ибо программингом заниматься - явно не твое дело"
То-то у нас проблемы с коммунальными услугами! Потому что у нас такие управдомы!
Digitman (2004-11-11 15:48:00) [10]
> 1) эта функция офигеть сколько раз вызывается
и что ?
> 2) ну, равно там это p какому-то числу, но оно же же мне
> ни о чем не говорит абсолютно
либо читай книги/ станд.справку, чтобы тебе это хоть о чем-то хоть как-то хоть когда-то "заговорило", либо срочно переквалифицируйся в кого угодно, хоть управдомы, ибо программингом заниматься - явно не твое дело при таком уровне логики в формировании вопросов
третьего не дано.
cvg (2004-11-11 15:38:00) [11]Как правильно написать? --
f p = $00000000
then n := 0;
n.prev := p;
p.next := n;
Romkin (2004-11-11 15:23:00) [12]0 - это nil :)) То есть, уже прогресс: ссылка была обнулена, а ты к ней обратился.
cvg (2004-11-11 15:21:00) [13]To Digitman: ну, попробовал я поставить на этой точке останов. Но ведь 1) эта функция офигеть сколько раз вызывается; 2) ну, равно там это p какому-то числу, но оно же же мне ни о чем не говорит абсолютно.
А вот при обработке прогой одного из файлов она выдала ту же ошибку, но только в ней написано "Write of address 00000000". Куда это она собирается по нулевому адресу чего-то записать?
Rem (2004-11-11 14:28:00) [14]Если код - не Ваш, то начните с анализа алгоритма.
Потом проанализируйте работу алгоритма в частных случаях:
- начала списка;
- конца списка;
- в случае пустого списка.
Хорошо проработанный алгоритм легко обходит подобные ситуации.
Как крайний случай, прежде чем использовать элемент, проверяйте его на неравенство nil:
if (n <> nil) then
...
Однако, это не лучший выход, так как автором алгоритма, вероятно, не были проработаны все детали, и, в следствие этого, у Вас может появится "странное" поведение программы.
Digitman (2004-11-11 13:55:00) [15]
> cvg (11.11.04 13:49) [33]
похоже, что из той же...
только вот в данном простейшем случае нет никакого повода лезть так глубоко - в дебри System.pas
если следы ведут к строчке
n.prev := p
то совершенно очевидно, что блох следует искать у себя, а не у Борланда
ищи место в СВОЕМ алгоритме , где у тебя переменная n в какой-то момент времени по ходу работы ТВОЕГО алгоритма приобретает черт-те какое значение, только не то что ты ожидаешь иметь в этой строчке
cvg (2004-11-11 13:49:00) [16]А это вот из той же серии? (остановилась на строке "Error(reInvalidPtr);"):
function _FreeMem(P: Pointer): Integer;
{$IF Defined(DEBUG) and Defined(LINUX)}
var
Signature: PLongInt;
{$IFEND}
begin
if P <> nil then
begin
{$IF Defined(DEBUG) and Defined(LINUX)}
Signature := PLongInt(LongInt(P) - 4);
if Signature^ <> 0 then
Error(reInvalidPtr);
Signature^ := FreeMemorySignature;
Result := MemoryManager.Freemem(Pointer(Signature));
{$ELSE}
Result := MemoryManager.FreeMem(P);
{$IFEND}
if Result <> 0 then
Error(reInvalidPtr);
end
else
Result := 0;
end;
Digitman (2004-11-11 12:25:00) [17]
> cvg (11.11.04 12:06) [26]
> Ну так вот она и остановилась на сторочке
>
> n.prev := p;
>
> И что мне с ней делать?
вариантов не так уж и много, всего-то два:
1. Выкинуть нкафих свою программу в мусор, забросить навсегда это гиблое дело и заняться чем-нть иным, не менее полезным. но более простым.
2. Оттрассировать программу и понять, почему значение переменной n в момент выполнения упомянутой строчки равна черт-те чему, но только не тому что ожидалось тобой.
Romkin (2004-11-11 12:24:00) [18]Двунаправленный список :)) С ним оченно осторожно надо работать, смотреть, чтобы все указатели шли как надо.
Плюс AV - очень неприятная вещь, скорее всего ошибка не здесь, а в другом месте: где-то путает ссылки. И происходит обращение в то место памяти, которая уже освобождена. Это называется висящей ссылкой, очень неприятно: ссылалось поле на запись, потом ее освободили, а ссылку не скорректировали...
Решение: отлаживать, смотреть исходники, доказывать правильность каждой процедурыи тд.
Плохиш (2004-11-11 12:23:00) [19]
>cvg (11.11.04 11:21) [21]
>Плохишу: Заголовок у этого модуля:
А вот незачем лезть в менеджер памяти борланда, не понимая что делаешь и как это работает.
TUser (2004-11-11 12:21:00) [20]
> в котором именно (или хотя бы примерно) месте ее искать?
Уж точно не в ГетМем