Форум: "Прочее";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
ВнизОпять Access violation Найти похожие ветки
← →
petrovsky © (2006-12-20 14:21) [0]Помогите найти причину ошибки. После очередной порции доработок возникла следующая ситуация. Программа компилируется нормально (Ctrl + F9). Ехе-файл создается нормально и работает нормально. А вот при попытке запустить программу из исходника (по F9) при вхождении в
Application.CreateForm(TForm1, Form1); выдает ошибку
"Access violation at adress 0041A07C in module Project1.exe. Write of adress CCE94BE4". И все. Все попытки найти причину пока не увенчались успехом.
Подскажите, пожалуйста, где и как искать.
← →
Ega23 © (2006-12-20 14:24) [1]Обращение к несуществующему (неправильному) адресу.
← →
Mystic © (2006-12-20 14:28) [2]Для начала сделать Search -> find error и ввести там 0041A07C
← →
Petrovsky © (2006-12-20 14:38) [3]
> Mystic [2]
Ну а дальше?. Его то и искать не надо - включил CPU view и любуйся. Только вот как этот ассемблер связать с программой в Delphi?
← →
clickmaker © (2006-12-20 14:40) [4]
> petrovsky © (20.12.06 14:21)
включи use debug dcu, войди в Application.CreateForm( отладчиком и смотри
← →
Ega23 © (2006-12-20 14:44) [5]А ты уверен, что валится именно там, а не на TForm1.OnCreate каком-нибудь?
← →
Petrovsky © (2006-12-20 14:56) [6]
> Ega23 [5]
Туда процесс не доходит. Первое же нажатие F7 на Application.CreateForm(TForm1, Form1) и выдает ошибку.
> clickmaker [4]
Пробовал. Выдает эту же ошибку еще по нескольки адресам пока окончательно не прекратит весь процесс. А все то, что в окне для меня - китайская грамота. Подскажите, можно ли по этой информации определить причину ошибки.
← →
BiN © (2006-12-20 15:01) [7]У некоторых компонентов есть события, управление к которым переходит до выполнения OnCreate родительской формы. Например, OnChange в PageControl.
← →
Сергей М. © (2006-12-20 15:02) [8]
> petrovsky © (20.12.06 14:21)
> Его то и искать не надо - включил CPU view и любуйся
Неумение пользоваться встроенным отладчиком "за отмазку не канает".
← →
clickmaker © (2006-12-20 15:32) [9]
> [6] Petrovsky © (20.12.06 14:56)
>
> > Ega23 [5]
>
>
> Туда процесс не доходит. Первое же нажатие F7 на Application.CreateForm(TForm1,
> Form1) и выдает ошибку
нажатие F7 должно впустить тебя внутрь CreateForm. Если этого не происходит, то либо у тебя debug dcu не включены, либо Application = nil
← →
Anatoly Podgoretsky © (2006-12-20 15:35) [10]> clickmaker (20.12.2006 15:32:09) [9]
Оно должно впустить и без debug dcu, особенно если перед эти включить CPU Window
← →
Petrovsky © (2006-12-20 15:41) [11]
> clickmaker [9]
Это вообще только начало проекта - создание первого модуля - DataModule. В этом то и вся трагедия - полностью остановилась разработка.
← →
clickmaker © (2006-12-20 15:44) [12]
> [11] Petrovsky © (20.12.06 15:41)
а как это у тебя "Ехе-файл создается нормально и работает нормально"?
с одним ДатаМодулем? Что за приложение такое?
← →
Petrovsky © (2006-12-20 15:59) [13]
> clickmaker [12]
Да проект уже большой. Я имею в виду, что программа загибается в самом начале на создании первого модуля проекта, е не при создании какой-то формы уже внутри.
← →
Сергей М. © (2006-12-20 16:02) [14]
> Petrovsky © (20.12.06 15:59) [13]
Ну так ты локализовал строчку Паскаль-текста, при выполнении которой происходит сабж ? рекомендацию [2] ты выполнил или нет ?
← →
clickmaker © (2006-12-20 16:02) [15]
> [13] Petrovsky © (20.12.06 15:59)
см. [8]
← →
Mystic © (2006-12-20 16:07) [16]Итак, как вариант возможно то, что кто-то закрыл исключение блоком try..except, поэтому оно возникает при отладке, но его нет в релизе. Если это действительно так, то можно (а) просто его проигнорировать нажав F9 (б) Отключить остановку по исключению. Конечно, это очень ужасный стиль, но как я понял, тебя не интересует сермяжная правда, а нужен результат здесь и сейчас, а то, что через несколько дней работать с кодом станет невозможно, это несущественые детали.
Ну а если ты решил действительно установить причину access violation, то по секрету скажу, что характер ошибки указывает на то, что ты пользуешься непроинициализированым указателем (возможно повреждена область памяти, если ты используешь что-то низкоуровневое, вроде Move). Посему надо воспользоваться советами предыдущих ораторов и:
(1) Почитать немного про указатели и память
(2) Поразмыслить над прочитаным, сделать пару лабораторных работ
(3) Установить флажок Use debug DCU
(4) После исключения посмотреть место где оно возникло, поразмыслить над этим (по крайней мере судя по адресу, ошибка в коде VCL, а не внутри библиотек Windows, что хорошо)
(5) Посмотреть на стек вызовов, может это подскажет тебе решение проблемы
(6) Идти внутрь методов VCL по F7 до тех пор, пока не случится AV. Долго думать о причинах
← →
Petrovsky © (2006-12-20 16:51) [17]Вроде удалось установить источник. В последней доработке менял хранимую процедуру на сервере. Соответственно изменился состав полей в DataSet проекта и в сетке на форме - что-то убрал, что-то добавил. После этого глюк и возник. Видно где-то что-то осталось. Убрал DataSet и отключил форму - программа зашевелилась. Сейчас буду восстанавливать.
Всем спасибо. Хотя, честно признаюсь, как связать содержимое окна CPU с текстом программы так и не разобрался.
← →
Плохиш © (2006-12-20 17:02) [18]
> Хотя, честно признаюсь, как связать содержимое окна CPU
> с текстом программы так и не разобрался.
В окне CPU представлен код программы в в виде ассемблера.
PS. А Вашей фирме пора уже нанять программиста.
← →
iZEN © (2006-12-20 23:02) [19]Нету в Delphi провеяемых исключений, потому и грабли практически везде разложены.
← →
tesseract © (2006-12-20 23:10) [20]
> В окне CPU представлен код программы в в виде ассемблера.
> PS. А Вашей фирме пора уже нанять программиста.
Давно ЧГ не сталкивался с необходимостью заглядывать в регистры при отладке.
Хотя как-то пришлось побороться с "оптимизацией " компилятором по занимаемой памяти.
> iZEN © (20.12.06 23:02) [19]
Raise + try...except вроде что-то проверяют :-)
← →
ЮЮ © (2006-12-21 09:34) [21]Это вообще только начало проекта - создание первого модуля - DataModule.
А в AfterOpen/Scroll какого нибудь DataSet-а стоит Form1.Captin := ... , а Form1 в этот момент = nil;
← →
Mystic © (2006-12-21 09:51) [22]> Нету в Delphi провеяемых исключений
И как это может помочь?
← →
evvcom © (2006-12-21 10:29) [23]> [17] Petrovsky © (20.12.06 16:51)
> Хотя, честно признаюсь, как связать содержимое окна CPU
> с текстом программы так и не разобрался.
См. [2],[9] (debug dcu) + в окне CPU в контекстном меню есть еще "View Source"
> [10] Anatoly Podgoretsky © (20.12.06 15:35)
> Оно должно впустить и без debug dcu, особенно если перед
> эти включить CPU Window
Ну с CPU Window все ясно, но без "особенно" и без "debug dcu" меня не пускает. :)
← →
Petrovsky © (2006-12-21 17:43) [24]Ну вот и добрался до причины. Оказалось, такая реакция была на... идентификатор поля DataSet. Было "QRExp". Убрал две последних буквы и все заработало. Вот только хотел спросить у некоторых программистов (Плохиш © (20.12.06 17:02) [18]) как такой глюк можно выловить с помощью "кода программы в виде ассемблера"
← →
Loginov Dmitry © (2006-12-21 20:09) [25]> как такой глюк можно выловить с помощью "кода программы
> в виде ассемблера"
Также как и любой другой глюк.
← →
iZEN © (2006-12-21 23:41) [26]
> Mystic © (21.12.06 09:51) [22]
>
> > Нету в Delphi провеяемых исключений
>
> И как это может помочь?
В 50 случаях из 100 ты не сможешь наступить на грабли. Физически. :)
← →
tesseract © (2006-12-22 00:00) [27]
> как такой глюк можно выловить с помощью "кода программы
> в виде ассемблера"
Можно, но проще пошаговой отладкой.
← →
evvcom © (2006-12-22 09:21) [28]> [24] Petrovsky © (21.12.06 17:43)
> такая реакция была на... идентификатор поля DataSet
Это вообще элементарно ловится и без Window CPU в течение нескольких секунд, но с debug dcu. Еще должна галка стоять "Stop on Delphi Exception". Тогда при возникновении ошибки прога вывалится на DB.DatabaseError с параметром Message типа "Field MY_FUCKER_FIELD not found", смотришь стек (View -> Debug Windows -> Call Stack) и находишь вызов TDataSet.FieldByName("MY_FUCKER_FIELD "); (3-я строка) и щелкаешь по строке на одну ниже (4-я строка). Там и находишь в своем коде обращение к полю "MY_FUCKER_FIELD".
← →
Petrovsky © (2006-12-22 10:18) [29]
> evvcom © (22.12.06 09:21) [28]
Да поле это было, и его идентификатор правильный. Вот только он почему-то не понравился Delphi. Пришлось его заменить в хранимой процедуре на сервере и, соответственно, в DataSet программы.
← →
evvcom © (2006-12-22 10:20) [30]> [29] Petrovsky © (22.12.06 10:18)
> Вот только он почему-то не понравился Delphi
Чудес не бывает. Видимо, ты с чем-то не разобрался.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.015 c