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

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

Ловля


Страницы:   1 2

Сергей Б. ©   (2002-08-07 13:59:00) 

Приветствую, друзья! Проблемка наметилась: при выполнении происходит молчаливое вылетание программы без каких бы то ни было сообщений. Вернее сообщение от Дельфей есть, но оно как бы не об ошибке как это обычно бывает, а информационное: типа там у вас что-то с программой, фаулт какой-то и привет. После такого сообщения трассировка становится невозможной, выполнение кода как будто бы зацикливается. Если запускать программу вне Дельфей, то она просто схлопывается и выгружается из памяти. И тоже без сообщения об ошибке. Что за чудо?

Да! Началось всё с того, что я выделил кусок кода в виде процедуры без параметра (он у меня дважды вызывается). И вот при выходе из этой процедуры (по сути подпрограммы) всё гавкается. Блин, что же делать? Прошу совета!!!


Сергей Б.   (2002-08-09 09:40:00) [1]

Каким образом? Подробнее плиззз...


VaS   (2002-08-08 15:42:00) [2]

А не смешиваешь ли ты объектные и интерфейсные ссылки?


Сергей Б.   (2002-08-08 15:33:00) [3]


> А эти компоненты FIB ты в процедуре динамически создаешь
> - уничтожаешь ?

Нет, используются только те, что брошены на форму изначально.


> пока код не будет опубликован

А если все-таки абстрагироваться? Есть кусок кода, он находится внутри интерфейсной процедуры. Повторяется два (три, четыре - неважно) раза. Этот код вырезается и оформляется в виде простейшей вложенной процедуры (ну прямо как подпрограмма в Бейсике). Вместо него прописывается вызов этой процедуры. И все! Такой модифицированный код нормально компилится. При трассировке процедура превосходно вызывается и выполняется. Но при выходе - БАЦ! и ошибка. Мистика!

Код могу представить, но только не на всеобщее обозрение. Если есть желающие, вышлю на мыло.


Andrey007   (2002-08-08 13:24:00) [4]

IMHO, пока код не будет опубликован, дельные советы дать невозможно.


VAleksey   (2002-08-08 13:07:00) [5]

Мне кажется дело где - то в динамическом массиве и выходе за его границы.
Проверь значения элементов массивов (и других указателей) до процедуры и после. (можно и трассировкой) Возможно ты где-то косвенно к ним обращаешся. Отсюда и сбои после процедуры.
А эти компоненты FIB ты в процедуре динамически создаешь - уничтожаешь ?


Yuri Btr   (2002-08-08 11:30:00) [6]

Даже не знаю, поможет ли мой опыт в вашем случае. Но всё равно посмотрите:
Я писал программу, которая соединяется с сервером FTP через компонент NMFTP заходит в одну директорию и делает ей LIST, в OnList я забил закачивание найденных файлов методом LIST. Так вот первое время я не мог понять, почему у меня программа вылетает при попытке закачать файл с сервака (Access Violation ...)- оказалось, что OnList вызывается чаще, чем я успеваю закачать файл. Т.е. я имел дело с "асинхронным" процессом.


Сергей Б.   (2002-08-08 11:07:00) [7]


> пихайте код "напрямую", ведь он работает?

Да, видимо только это и поможет. :(


> процедуре не объявляли к-л. совпадающих по именам компонентов/переменных?

Нет, объявлений не было. Повторюсь, в процедуру запихнут дважды повторяющийся код. Никаких параметров! Никаких деклараций! Никаких локальных переменных!


> Тогда поставь BreakPoint в теле процедуры и не поленись

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


> Ты динамические массивы случаем в процедуре не используешь
> ?

Нет. В других местах использую, но там все работает.


> Возможно, что ты просто выходишь где-то за рамки массива.
> Какие компоненты ты используешь в этой процедуре.

Компоненты? FIB использую.

Резюме: либо глючат компоненты FIB, либо Дельфя. Любопытно, что в интерфейсной процедуре, из которой происходит вызов злополучной процедуры, используется еще две, аналогичным образом построенные процедурки (они вызываются значительно чаще - тысячи раз за один проход), и с ними нет никаких проблем!!! А вот эта...


IlyaA   (2002-08-08 07:36:00) [8]

Возможно, что ты просто выходишь где-то за рамки массива. Какие компоненты ты используешь в этой процедуре.

Замечание: Если эта процедура вызывается из какого-ни-ть объекта(напр. формы), то лучше сделай её методом этого объекта.


VAleksey   (2002-08-08 06:37:00) [9]

если бы он обращался к не созданному объекту то Access violation был бы по адресу FFFF... или 00000....
Ты динамические массивы случаем в процедуре не используешь ?


ЮЮ   (2002-08-08 05:35:00) [10]

Тогда поставь BreakPoint в теле процедуры и не поленись пройтись по ней, тогда увидишь где происходит access violation


Cobalt   (2002-08-07 21:02:00) [11]

242 строки - это, конечно, напряжно будет... Да и объяснять, что делает каждая переменная...

Какие хоть классы/компоненты используете, параметры этих классов/компонентов - ? А то все равно что спрашивать у слепого - какая это буква?

Или попробуйте отказаться от этой процедуры и пихайте код "напрямую", ведь он работает?

А вы в процедуре не объявляли к-л. совпадающих по именам компонентов/переменных?


Сергей Б (из дому)   (2002-08-07 20:13:00) [12]

Да-а... Это, пожалуй, для меня сложновато. Последний раз я ассемблер в глаза видел лет 12 назад. Тогда программировать под Виндовз мало кто умел, только ДОС.


MrBeer   (2002-08-07 19:47:00) [13]

esli problemi uzhe v sobrannom .exe ya obichno zapisivaju adres gde esjt problema, smotrju v IDA, a tam uzhe do Delphi 1 shag.


Сергей Б (из дому)   (2002-08-07 19:22:00) [14]

Нет там ни динамически создаваемых объектов, ни указателей! :( Весь код строится вокруг предопределенных переменных и объектов.


DAO   (2002-08-07 18:59:00) [15]

Мне кажется дело не в этом!!! Т.к. я раньше исп. проц. подход и писал их немерено в свойх прогахи причем таким же образом, т.е.
> procedure TForm1.Button1Click(Sender: TObject);
>
> procedure MyProcedure; // это моя глючная проца
> begin
> ...
> end;
>
> begin

У меня допустим такие ошибки чаще всего появляются когда обращаешься к объектам которых еще нет! Ну это тоже самое что и инициализация указателей!


ZrenBy   (2002-08-07 18:48:00) [16]

Про DataSet я сказал зря, но все равно попробуй


ZrenBy   (2002-08-07 18:45:00) [17]

Вместо MyProcedure
напиши Tform1.MyProcedure
должно заработать
Я думаю, что DataSet1 принадлежит Form1
а MyProc - нет, и соответственно она не может к нему обратиться


Сергей Б.   (2002-08-07 18:40:00) [18]

Вот как:

procedure TForm1.Button1Click(Sender: TObject);

procedure MyProcedure; // это моя глючная проца
begin
...
end;

begin
...
MyProcedure; // это вызов моей глючной процы
DataSet1.Active := false; // на этом месте вылетает
... // и не важно что за код в этой строке
end;


ZrenBy   (2002-08-07 18:32:00) [19]

А эта процедура как описана ?

procedure TForm1.pr;
или
procedure pr;


Сергей Б.   (2002-08-07 18:24:00) [20]


> Указатели инициализируй


А это как, извините?..


> Код в студию.


Да нет там ничего интересного. Когда он дважды повторялся, всё работало. Запихнул в процедуру (без изменений) - глючит.


Страницы:   1 2

Наверх

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