| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Access Violation |
| Автор: Leana 30.3.2007, 14:35 |
| Ребята, помогите. Мне надо отловить bug... Воспроизвести проблему не могу сама, но клиент это может время от времени... По call stack могу определить, что проблема возникает в определенной процедуре. Изучила процедуру. Нашла один объект, который создается и потом не уничтожается... Вопрос в следующем: может ли это быть причиной AV? Я всегда думала, что AV - это когда мы обращаемся к объекту, которого уже не существует... В моем случае, мы создаем объект, который был создан раньше, но память не была освобождена... Я думала, что это будет служить причиной memory leak, но не AV... Вопрос второй: если это служит причиной AV, может ли это также вызывать странное поведение у программы. Например, в моем случае, каждый раз, когда возникает AV, программа повторяет без всякой причины несколько процедур, которые были уже выполнены до этого. Например, при транзакции мы создали 3 записи... Потом перешли к процедуре внутри которой возникает AV, и потом почему то выполняются опять процедуры, которые создали 3 записи, и потом мы идем в Exception, где оно обрабатывается. Please help!!!! |
| Автор: Snowy 30.3.2007, 14:53 |
| Защищай код try..except/finally. Без этого вообще серъёзный код не пишется. |
| Автор: Leana 30.3.2007, 14:55 |
| try... except/finally в коде используется... |
| Автор: Snowy 30.3.2007, 14:59 |
| Значит AV не там ;-) |
| Автор: Leana 30.3.2007, 15:17 |
| AV там... и она обрабатывается в except блоке. В except блоке мы даем команду записать call stack в лог-файл. И из call стэка я могу понять, что произошла AV. ---------------------------17/03/07 09:48:18--------------------------- Exception 'EAccessViolation' in module Galaxy.exe at 000C3631 Access violation at address 004C4631 in module 'Galaxy.exe'. Read of address 000002F4 Module: Forms, Source: UNKNOWN, Line UNKNOWN Procedure: Forms.TCustomForm.Close Call stack: :004C4631 [Galaxy.exe] Forms.TCustomForm.Close :00EFB754 [Galaxy.exe] print_starting_here (tktdrv.pas, line 2652) :00405A40 [Galaxy.exe] System.__linkproc__ HandleFinally :7C9037BF [ntdll.dll] :7C90378B [ntdll.dll] :00EFB75F [Galaxy.exe] print_starting_here (tktdrv.pas, line 2653) :7C937B48 [ntdll.dll] :00EFB75F [Galaxy.exe] print_starting_here (tktdrv.pas, line 2653) :7C9105C8 [ntdll.dll] :7C910551 [ntdll.dll] :7C91056D [ntdll.dll] :7C9131DC [ntdll.dll] :7C913212 [ntdll.dll] и так далее print_starting_here - это именно та процедура, в которой создается объект, но потом не уничтожается. Опять же вопрос: может ли это служить причиной AV? Так как я не могу воспроизвести проблему, мне трудно сказать, что добавление FreeAndNil(MyObject) в блоке finally, устранит AV. |
| Автор: Snowy 30.3.2007, 15:23 |
| Нет. Это никак не может быть причиной AV. В чём причина - без кода сказать сложно. Покажи код - посмотрим. |
| Автор: Leana 30.3.2007, 15:31 |
| к сожалению, код показать не могу. во-первых, company privacy issues. Во-вторых, там процедуры в 2500 строк - черт ногу сломит. Ок, наверное, придется самой попытаться разобраться. Во всяком случае, вы мне сказали, что не уничтожение объекта не может служить причиной AV. Жаль... я думала, я была на верном пути :( |
| Автор: MetalFan 30.3.2007, 16:09 |
| ну тогда удачно поймать глюк) |
| Автор: Snowy 30.3.2007, 17:36 |
| Не стоит делать такие процедуры. Такой объём кода всегда нужно дробить на отдельные части. Иначе чревато вот такими сложностями с локализацией глюков. Да и читать такой код проблемно, не говоря уже о том, чтобы с ним работать. |
| Автор: Sunvas 30.3.2007, 17:44 |
| А пошаговым выполнением определить что, не удается? |
| Автор: Leana 30.3.2007, 19:02 |
| да, ребята, понимаю. Такие процедуры писать нельзя... Их написал кто-то очень умный несколько лет назад. Конечно, он здесь уже не работает... А мы жучков отлавливаем. :( Пошагово отловить не могу, потому что у меня AV не возникает. Скорей всего буду делать logging version. И потом по более детальной информации пытаться определить, в чем проблема. |
| Автор: dumb 31.3.2007, 02:08 |
| есть подозрение, что в print_starting_here (tktdrv.pas, line 2652) производится попытка закрыть уже уничтоженную форму. |
| Автор: dumb 31.3.2007, 02:28 |
| чуть конкретнее можно сказать, если хотя бы Galaxy.exe куда-нибудь выложишь. |
| Автор: Hidrag 15.5.2008, 19:39 |
| Ставил сегодня Delphi 2006, затем снес поставил Delphi 7 и снова эта ошибка! При открытие любого проекта и запуска его на выполнение вылазит эта ошибка! Создаю свой проект, очень простой, форма и несколько кнопок, нажимаю run, запускается приложение и тут же падает эта ошибка :( ЧТо может быть? У пользователя на компе права админские, хоть и не под админом сижу, может быть системе не дает делфи куда то в память лезти? |
| Автор: THandle 15.5.2008, 19:57 |
| Hidrag, такое? http://forum.vingrad.ru/forum/topic-201047.html Я с этим и по сей день мучаюсь, решения найти не могу... |
| Автор: Qu1nt 15.5.2008, 20:13 |
| Создайте пустое приложение. Если будет грузить библиотеку wininet.dll (например, "при попадании" курсора на форму), значит - троян. Помню, что один из симптомов: скрытая dll`ка в папке с программой (приблизительно: wsock.dll). Естественно удаляем, и не забываем включить антивирус. |
| Автор: Hidrag 15.5.2008, 21:18 |
| THandle, да да, оно самое! И не только делфи, визуал с++ 2005 тоже самое мне выдает, после чего открывается какое окно типа дебагера низкоуровневого... жуть... получается: пишу код, делаю ему буилт, после чего запускаю экзешник уже в папке проекта, а через ИДЕ этот глюх... |
| Автор: Hidrag 15.5.2008, 22:44 |
| А что значит пустое приложение? Я создал новый проект, просто форма, компилирую, запускаю - навожу на форму мышку - ошибка!!! Сделал показывать скрытые и даже системные файлы, в каталоге с проектом ничего лишнего нет :( |
| Автор: Qu1nt 15.5.2008, 23:21 |
| Это именно эта дрянь, просто другая разновидность. |