Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.19;
Скачать: CL | DM;

Вниз

Ловля   Найти похожие ветки 

 
Сергей Б.   (2002-08-07 13:59) [0]

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

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


 
Song ©   (2002-08-07 14:00) [1]

Ну... что можно сказать. Код хотя бы посмотреть проблемной процедуры.


 
tovSuhov ©   (2002-08-07 14:06) [2]

Тут ведь смотря какой фаулт...А вдруг сегментейшен?


 
Сергей Б.   (2002-08-07 14:08) [3]

Хм... 242 строки?


 
Сергей Б.   (2002-08-07 14:12) [4]

2 tovSuhov: "access violation at 0x0058e5b7: read of address 0x000004b2"


 
VaS ©   (2002-08-07 15:05) [5]

Код в студию.


 
Anatoly Podgoretsky ©   (2002-08-07 15:21) [6]

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


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


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


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


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


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


 
ZrenBy ©   (2002-08-07 18:32) [8]

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

procedure TForm1.pr;
или
procedure pr;


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

Вот как:

procedure TForm1.Button1Click(Sender: TObject);

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

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


 
ZrenBy ©   (2002-08-07 18:45) [10]

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


 
ZrenBy ©   (2002-08-07 18:48) [11]

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


 
DAO ©   (2002-08-07 18:59) [12]

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

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


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

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


 
MrBeer ©   (2002-08-07 19:47) [14]

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 20:13) [15]

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


 
Cobalt ©   (2002-08-07 21:02) [16]

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

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

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

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


 
ЮЮ ©   (2002-08-08 05:35) [17]

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


 
VAleksey ©   (2002-08-08 06:37) [18]

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


 
IlyaA ©   (2002-08-08 07:36) [19]

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

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


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


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

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


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

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


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

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


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

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


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

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

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


 
Yuri Btr ©   (2002-08-08 11:30) [21]

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


 
VAleksey ©   (2002-08-08 13:07) [22]

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


 
Andrey007   (2002-08-08 13:24) [23]

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


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


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

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


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

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

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


 
VaS ©   (2002-08-08 15:42) [25]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
6-60770
Sin
2002-06-04 13:55
2002.08.19
Собственны проси сервер


7-60880
SleD
2002-06-01 19:05
2002.08.19
Каким образом работают Screenmates


1-60689
Брат
2002-08-06 09:57
2002.08.19
Компонента


7-60863
Timon
2002-06-03 14:28
2002.08.19
Свободная память


1-60675
BlackSun
2002-07-28 16:33
2002.08.19
Заполнение формы