Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как бороться с Access violation? [D7, WinXP]


Страницы:   1 2 3

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]


> в котором именно (или хотя бы примерно) месте ее искать?

Уж точно не в ГетМем


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо