Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Application Error - Exception EAccessViolation


Автор: vinc2000 31.3.2013, 19:35
Здравствуйте. С недавних пор при проверенном выходе (закрытии формы 1) стала вываливаться эта ошибка. Полный текст:
Application Error
Exception EAccessViolation in module **** at 001D2AE6
Access violation at adress 005D2AE6 in module ***. Read of address 037DC4C0.

Ошибка то появляется то пропадает, т.е. рандомит. Дело возможно в GLScene/\

Переустановка D7 + всех компонентов проблему не решила. Отключение всех dll не помогло. Также как ковыряние в гугломании. Вся надежда на вас smile 

Автор: kami 31.3.2013, 19:38
Цитата(vinc2000 @  31.3.2013,  19:35 Найти цитируемый пост)
Read of address 037DC4C0.

обращение к какому-то уже освобожденному объекту/области памяти (возможно - попытка повторного освобождения). Добавить в проект FastMM в debug-режиме и будет щасте.

Автор: vinc2000 31.3.2013, 19:42
понятно...значит утечки. Спс. за оперативность!

Автор: kami 31.3.2013, 19:51
Цитата(vinc2000 @  31.3.2013,  19:42 Найти цитируемый пост)
.значит утечки.

Да нет, не совсем утечки.
Просто FastMM скажет "попытка обращения к уже удаленному объекту". Объект был создан тогда-то так-то, удален тогда-то и так-то. А сейчас ты лезешь к нему, уже удаленному вот так.
Гораздо проще найти ошибку повторного обращения, имея полный стек действий, приведших к ошибке.

Автор: vinc2000 1.4.2013, 08:15
Ок. Буду разбираться.

Автор: Beltar 1.4.2013, 14:18
Я недавно столкнулся с похожей ошибкой. Шаманил часов 6, проблема оказалась в неправильной низкоуровневой функции переставлявшей байтики и в какой-то момент разрушавшей память. Если в коде есть что-то подобное, то проинспектировать тщательно и попробовать потключать вызовы.

Автор: vinc2000 2.4.2013, 15:10
Потестил с использованием FASTMM. Результаты для меня как азбука морзе smile 

user posted image

Включил по совету FullDebugMode и LogMemoryLeakDetailToFile. Файл в приложении. Так на кого мне все-таки кивать - на удаленный объект или утечку?

Автор: northener 2.4.2013, 15:39
Цитата(vinc2000 @  31.3.2013,  19:35 Найти цитируемый пост)
Вся надежда на вас

Рекомендую попробовать http://www.eurekalog.com/index_delphi.php.
Триальная версия полнофункциональна в течение 30 дней. 

Ну и вот ещё хорошая статья http://www.gunsmoker.ru/2009/05/access-violation.html.

Автор: Beltar 2.4.2013, 15:56
К теме
http://www.gunsmoker.ru/2010/02/redux.html

Проблема в том, что если память где-то раздолбана, то тестом на утечки это сложновато выловить. Мне вот здесь http://forum.vingrad.ru/forum/topic-365498.html от FastMM тоже толку не много, и без него видно, что объект nil, но почему я не знаю.
Если у тебя GL-Scene, то наверняка есть какие-то буферы вершин и т. п. (3D-графикой интересовался поверхностно), довольно хорошее место чтобы ошибиться с указателями, размером данных, не прописать packed и т. п.

Автор: superVad 2.4.2013, 16:52
Цитата(vinc2000 @  2.4.2013,  14:10 Найти цитируемый пост)
Потестил с использованием FASTMM. Результаты для меня как азбука морзе  

Ну можешь включить вывод в текстовый лог - там будет больше инфы. Но и так видно, что два объекта утекает. Посмотри где ты такие создаешь и почему не уничтожаешь.
А так - почитай гансмокера - ссылки тебе дали.

Добавлено @ 16:54
Один раз еле отловил ошибку при выходе. В финалайзе одного модуля, просто уничтожал объект - так и не понял, почему была ошибка, просто перенес в другое место уничтожение кажется.

Автор: vinc2000 2.4.2013, 17:09
Ок. Буду разбираться. Спс. за наводки.

Автор: northener 3.4.2013, 01:16
Цитата(vinc2000 @  2.4.2013,  17:09 Найти цитируемый пост)
Спс. за наводки.

Обрати внимание на сторонние компоненты, которые ты может быть используешь, которые могут создавать доппотоки. 
Ну и ещё на таймеры. Их желательно первым делом выключать ручками при закрытии приложения. 

Автор: vinc2000 3.4.2013, 19:00
Отписываюсь о результатах:
1. Скачал и установил Эврику, но в видео-туториале XE2, а у меня семерка в XPSP3 - пунктика нету так и не понял где его искать надо...
2. Провел санацию кода: таймеров оказывается меня нет, освободил все TBitmap'ы, вычистил все что связано с GLScene, убрал подозрительный код и... ошибка осталась, но только когда компилится, т.е. в самой IDE, при внешнем запуске - все работает просто идеально! Странно smile
user posted image
(Подозреваю что дело тут возможно в кривых компонентах или IDE). Поэтому...
3. Соглашусь с GunSmoker'ом, что это частично "Глюки Delphi", т.е. ЛЖЕ-УТЕЧКИ...

Автор: northener 3.4.2013, 19:16
Цитата(vinc2000 @  3.4.2013,  19:00 Найти цитируемый пост)
Скачал и установил Эврику, но в видео-туториале XE2, а у меня семерка в XPSP3 - пунктика нету так и не понял где его искать надо

Какого пунктика?

Автор: vinc2000 3.4.2013, 19:23
EurekaLog Options, т.е. не могу Activate EurekaLog.

user posted image

Автор: northener 3.4.2013, 20:01
На Д6 выглядит так:

Автор: vinc2000 3.4.2013, 22:30
Ок. Потестил Eurek'ой -> ссылается на компонент регулятор громкости jantracker (начало модуля). 
http://s2.ipicture.ru/uploads/20130403/VeqgZw3H.jpg
Удалил его - ошибка исчезла! Поставил заново - все тоже. Но компонент для меня незаменимый, поэтому прошерстил jantracker.pas, проблема я думаю в неособожденном 

Код

FBackBitmap := TBitmap.Create;


Кто что думает по этому поводу?


P.S. Улетная вещь - эта ваша Эврика!

Автор: northener 3.4.2013, 22:36
Цитата(vinc2000 @  3.4.2013,  22:30 Найти цитируемый пост)
Ок. Потестил Eurek'ой -> ссылается на компонент регулятор громкости jantracker (начало модуля). 
Eureka Results

Ты не Leaks показывай, а Call Stack.

И посмотри на какой строке исходника произошла ошибка.

Автор: vinc2000 3.4.2013, 22:57
А call stack у меня нет:( Только General и Leaks:

Строка 124, т.е.:
Код

FBackBitmap := TBitmap.Create;


P.S. Начал копать глубже без jantracker - та же ошибка, только теперь ссылается на Controls.pas и на Classes.pas.
Код

procedure TControl.DblClick;
begin
  if Assigned(FOnDblClick) then FOnDblClick(Self);
end;


Мда, как говорится - Это только начало пути... smile 

Автор: northener 3.4.2013, 23:11
Цитата(vinc2000 @  3.4.2013,  22:57 Найти цитируемый пост)
А call stack у меня нет:( Только General и Leaks:

Можешь выложить сюда эльфа? (Файл "Имяприложения.elf")

Автор: northener 4.4.2013, 01:15
Цитата(vinc2000 @  3.4.2013,  22:57 Найти цитируемый пост)
А call stack у меня нет:( Только General и Leaks:

Ага понял.
Это было всего лишь сообщение об утечках памяти. Но топик-то вроде изначально был об AV. Ты вот получи AccessViolation при включенной Эврике. Тогда посмотрим на отчёт Эврики и поговорим.
А на утечки памяти потом обратишь внимание. Они конечно зло. Но AccessViolation гораздо хуже. И гораздо труднее находить его причину.

И уж утечки памяти (Memory Leaks) никак не могут быть причиной AccessViolation! Тут совсем обратная ситуация. Утечки памяти это когда программа просит у ОС выделить для себя память, получает её, как-то использует (чаще всего однократно) и забывает её возвращать ОС. И таким образом память будет потеряна. Программа её не использует, а другим программам эта память не может быть передана.
AccessViolation же возникает в том случае, когда программа обращается к области памяти, которая ей не принадлежит. Либо не была выделена ОС, либо ранее была выделена ей, но уже возвращена ОС.

P.S.
  ОС - Операционная система. В данном случае Windows.
P.P.S. 
  Термин программа стоит читать как процесс.

Автор: Beltar 4.4.2013, 15:59
Вполне возможно, что удалив компонент ты только уменьшил размер программы, так что разрушение памяти стало происходить где-то в "безопасной" зоне (ну может данные какие-то, которые можно безнаказанно затереть\испортить), добавил процедурку в обработчик и все, размер снова вырос, и ломается какая-то нужная таблица.
У меня в соседней теме ошибка вообще оказалась в непрописанном inherited Create. Причем сколько помню это inherited всегда вставлялсь автоматически при создании конструктора по Ctrl-Shift-C, можешь свои классы, если есть на подобное проверить, но подобное все-таки локализует проблему ошибочным классом.

Автор: Akella 4.4.2013, 20:28
Цитата(vinc2000 @  3.4.2013,  19:00 Найти цитируемый пост)
в видео-туториале XE2, а у меня семерка в XPSP3


Ты путаешь Windows и Delphi smile 

Автор: vinc2000 4.4.2013, 21:44
Цитата(Akella @  4.4.2013,  20:28 Найти цитируемый пост)
Ты путаешь Windows и Delphi

Я пока что ничего не путаю smile
Если ты смотрел туториал - там тестится на XE2 в 7, а у меня D7 в XPSP3. (проблема с установкой EurekaLog уже решена)

Ок. Я так понимаю что это дело может затянуться надолго smile Как я уже говорил - дело похоже в лже-утечках на D7! Переносить в XE2 особого желания нет. FASTMM4 и Эврика их фиксируют но только в режиме компиляции с компонентом jantracker (без него все ок!) (я специально подчеркнул). При внешнем запуске exe'шника - все ок! -  при закрытии - никаких AV не вываливается...Когда играет музычка и закрываем - AccessViolation опять же в режиме компиляции и список утечек (скорее лжеутечек), а также особенности по видимому NewAc 2.6.1. При внешнем запуске и закрытии с музычкой - все ок.
Ковырять надо jantracker.pas, и файла elf у меня кстати нет:(. А где его искать то надо?

Цитата(Beltar @  4.4.2013,  15:59 Найти цитируемый пост)
но подобное все-таки локализует проблему ошибочным классом.

У этой медали 2 стороны: нельзя не рассматривать такой вариант, когда все же никто не застрахован от подобного рода разрушений памяти. Я конечно не даю 100% гарантии, что логика верна (результаты FASTMM тому в доказательство), но все же стараюсь придерживаться "простоты и прозрачности кода", а также его периодической санации, т.е. удаляю/заменяю деструктивные участки. В целом благодаря модульности (видео-1 модуль, текст+аудио-2 модуль и т.д.) код не превращается в неперевариваемую кашу и может поэтому удается избегать тучи критических AV и AError'ов. Кто знает smile 

Автор: northener 4.4.2013, 21:55
Цитата(vinc2000 @  4.4.2013,  21:44 Найти цитируемый пост)
 дело похоже в лже-утечках на D7

Да забудь ты про утечки! Они тут не при чем.


Цитата(vinc2000 @  4.4.2013,  21:44 Найти цитируемый пост)
 файла elf у меня кстати нет:(. А где его искать то надо?

Когда появится ошибка, тогда появится и файл. В той же папке, что и программа.

Автор: vinc2000 4.4.2013, 22:18
Специально сейчас нашел AV во внешке exe - Call Stack теперь есть! И нашел el-файл (он был аж в Application Data\EurekaLab s.a.s\EurekaLog\Bug Reports)
Прикрепляю. AV-ошибка мне известна, т.е. она возникает не при закрытии программы, а при клике. 

Автор: northener 5.4.2013, 01:36
Цитата(vinc2000 @  4.4.2013,  22:18 Найти цитируемый пост)
И нашел el-файл (он был аж в Application Data\EurekaLab s.a.s\EurekaLog\Bug Reports)

Очень хорошо, что нашел.
(Я являюсь честным обладателем лицензии на Эврику, но версии 6. А в версии 6 эти файлы Эврика помещала в папку программы).
Вот теперь открой этот файл при запущенной Дельфи и щёлкни по строке 
|7FFFFFFE|04     |00000000|006BA7E6|FlashEx.exe |002BA7E6|Unit3            |TForm3           |Next_btnClick                         |126[3]   |
Или открой модуль, в котором описан тип TForm3, найди в нем метод Next_btnClick и посмотри, что там находится на третьей строке полсле начального begin.
И покажи эту строку тут.

P.S.
На худой конец кинь мне в личку сам EXE-файл и DLL файлы, которые ему нужны. Попробую найти проблему.

Автор: vinc2000 5.4.2013, 14:11
Код

  Data := Form1.VT1.GetNodeData(Node); //VT1 - это VirtualStringTree


А в чем проблема-то northener? Эта ошибка связана с листанием листов pdf-файла и возникает она потому-что книга не загружена, а кнопки листания активны smile 
Я уже понял, что самое главное - когда при внешнем закрытии все ок!, а то что там при выходе в режиме компиляции вываливаются какие-то ErrorDialogs или AV - это все пурга smile 
См. вложение (Next_btn & Previous_btn обведены - а в коде условие с циклом)

Автор: Чучмек 5.4.2013, 14:28
Цитата(vinc2000 @  5.4.2013,  14:11 Найти цитируемый пост)
Я уже понял, что самое главное - когда при внешнем закрытии все ок!, а то что там при выходе в режиме компиляции вываливаются какие-то ErrorDialogs или AV - это все пурга

Уверен? Есть обращение в никуда. Просто  под отладчиком память распределяется по-другому

Автор: Beltar 5.4.2013, 16:13
Мне вот пока известен только один случай явной пурги, это неизвестное исключение при работе с базой, когда таблица не может лукапнуть что-то, т. к. KeyValue=NULL, в остальных случаях вряд ли стоит надеяться, что все прокатит.

Автор: vinc2000 5.4.2013, 20:09
Даже так бывает.
http://s1.ipicture.ru/Gallery/Viewfull/23636599.html

Спс. всем за участие! Тему можно закрывать.

Автор: northener 7.4.2013, 01:52
Цитата(vinc2000 @  5.4.2013,  20:09 Найти цитируемый пост)
Даже так бывает.


Цитата(vinc2000 @  5.4.2013,  20:09 Найти цитируемый пост)
Спс. всем за участие! Тему можно закрывать.

Очень необдуманное решение!

Очень глупо перестать искать ошибку в программе. А она там точно есть!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)