Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как забить сообщение AccesViolation 
:(
    Опции темы
TheAviator
Дата 7.2.2004, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 28.9.2003
Где: Николаев-Киев

Репутация: нет
Всего: нет




Выскакивает тут (иногда, не на каждом цикле):
Код
for i:=0  to DataSize-1 do abtQuest[i]:=Byte(sQuest[i+1]);

Причину установить не могу, но не влияет на работу проги.

Проверял с ним разобраться таким образом:
Код
try
for i:=0  to DataSize-1 do abtQuest[i]:=Byte(sQuest[i+1]);
except end;

Но почему-то все равно его выводит... Хотя по задумке должно ловить ошибку и ничего не предпринимать в этом случае...
PM MAIL WWW ICQ   Вверх
Tamerlann
Дата 7.2.2004, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 10.11.2002
Где: Минск, Беларусь

Репутация: нет
Всего: 2



1). Раз всё равно выводит ошибку, значит ошибка не там
2). Напиши поподробнее плиз, что за abtQuest, sQuest, их размеры и тип.

P.S. я бы что-нибудь написал в except, хоть showmessage, тогда точно увидишь, отлавливает он её или нет, а так не понятно, может он и отловил, но выполнять-то нечего в except'e.
--------------------
http://timursdev.blogspot.com/ 
PM MAIL WWW Skype   Вверх
p0s0l
Дата 7.2.2004, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



TheAviator, если ошибка там, но окно вываливается, то:
а) Tools->Debugger Options->Language Exceptions->Stop on Delphi Excpetions - вот эту галочку отключи
б) запусти программу не из Delphi



--------------------
С уважением, г-н Посол.
PM   Вверх
TheAviator
Дата 7.2.2004, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 28.9.2003
Где: Николаев-Киев

Репутация: нет
Всего: нет



Код
1). Раз всё равно выводит ошибку, значит ошибка не там

- Я запускал в режиме отладки. Вываливается на этой строке.

Код
если ошибка там, но окно вываливается, то:
а) Tools->Debugger Options->Language Exceptions->Stop on Delphi Excpetions - вот эту галочку отключи
б) запусти программу не из Delphi

- Не из Дельфи тоже вываливается! А тот вариант что ты предложил это только для режима отладки?

PM MAIL WWW ICQ   Вверх
TheAviator
Дата 7.2.2004, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 28.9.2003
Где: Николаев-Киев

Репутация: нет
Всего: нет



Данные принимаютя от компонента Com-порта, он возращает указатель на данные и их размер. Я загоняю необходимые мне байты в строку, а потом преобразовываю их в массив. Таким образом получаю обмен двоичными данными (не ASCCII). Компонетов в проге два, в разных DataModul-ях.
Кусочек кода с определением переменных и заголовком процедыры ниже.

Код
procedure TDMExchangeExt.CPortReceiveData(Sender: TObject; DataPtr: Pointer;
 DataSize: Cardinal);
var iLastLine, i, p1: integer;
   sQuest  : string;
   abtQuest: array [0..20] of byte;
   abtReply: array[0..28] of byte;
   pReply  : pointer;
begin
 sQuest:=' ';
 sQuest := StringOfChar( ' ', DataSize );
 sInput:=' ';
 for i:= 0 to 20 do abtQuest[i]:=0;
 move( DataPtr^, pchar(sQuest)^, DataSize );
 for i:=0  to DataSize-1 do abtQuest[i]:=Byte(sQuest[i+1]);
 for i:=0  to DataSize-1 do sInput:=sInput+inttostr(abtQuest[i])+' ';
..........................
..........................


Это сообщение отредактировал(а) TheAviator - 7.2.2004, 15:19
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 7.2.2004, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Попробуй так:
Код
SetLength(sQuest, DataSize);
sInput := ' ';
move (DataPtr^, sQuest[1], DataSize);
move (abtQuest, sQuest[1], DataSize);
for i := 0 to DataSize-1 do sInput := sInput + inttostr(abtQuest[i])+' ';

А ошибка была у тебя в строке с move: вместо PChar(sQuest)^ надо sQuest[1]



--------------------
С уважением, г-н Посол.
PM   Вверх
TheAviator
Дата 7.2.2004, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 28.9.2003
Где: Николаев-Киев

Репутация: нет
Всего: нет



Опа. Кажется, я понял, почему почему вылетало Access Violation.
По задумке действительно, не должно было приходить пакетов длинней 20 байт.
Но иногда приходили длинные (ошибочные, или склееные пакеты), большей длины.
Строка подгоняла свой размер под размер пакета, а массив так и оставался длинной до 20.
В том самом операторе происходило обращение к несуществуюущему элементу массива, на что и выдавалось Access Violation.
Исправляется так :

Код
if DataSize>20 then DataSize:=20;

PM MAIL WWW ICQ   Вверх
TheAviator
Дата 7.2.2004, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 28.9.2003
Где: Николаев-Киев

Репутация: нет
Всего: нет



Кстати, так на вопрос топика и не ответили:

Цитата
КАК ЗАПРЕТИТЬ ПРИЛОЖЕНИЮ ВЫДАВАТЬ ACEES VIOLATION ВО ВРЕМЯ ИСПОЛНЕНИЯ?

PM MAIL WWW ICQ   Вверх
December
Дата 7.2.2004, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Цитата(TheAviator @ 7.2.2004, 16:50)
Кстати, так на вопрос топика и не ответили:

Цитата
КАК ЗАПРЕТИТЬ ПРИЛОЖЕНИЮ ВЫДАВАТЬ ACEES VIOLATION ВО ВРЕМЯ ИСПОЛНЕНИЯ?

Posol ответил. Это у тебя что-то напутано.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Medved
Дата 9.2.2004, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



если в Delphi, то как сказал Посол, иначе try с пустым except. Если же не поможет, тогда что-то делаете неправильно.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Makanaki
Дата 22.9.2004, 19:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А есть ли возможность убрать остановки только по эксепшинам, захваченым в try..except..end?
  Вверх
p0s0l
Дата 27.9.2004, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Если надо убрать остановку на исключениях, возникающих в try..except, то:
Цитата
Tools->Debugger Options->Language Exceptions->Stop on Delphi Excpetions - вот эту галочку отключи

Или что-то другое надо ?



--------------------
С уважением, г-н Посол.
PM   Вверх
Pathfider
Дата 28.9.2004, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.7.2004
Где: все там же

Репутация: -1
Всего: 1



А я думаю, что нужно прелопатить весь код проги и посмотреть, моежет усть какие-то незакрытые хендлы (файлы, прцессы, потоки ...). В обшем ка было уже сказано выясни на какой строке вылетает ошибка, а потом посмотри код который как либо связан с использованными переменными. Иногда даже помогает перенести старый код на новый проект.
--------------------
Trust is a weakness
PM MAIL   Вверх
Vit
Дата 28.9.2004, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



1) Access Violation - это однозначно критическая ситуация которую надо исправлять не путём отлова её, а путём исправления кода и недопущения. Это очень серьёзная ошибка, её игнорирование может привести к очень малопонятным и труднообъяснимым изменениям в поведении программы. Поэтому в каждом конкретном случае попытаться надо отловить ошибку и устранить причину а не следствие.

2) Отлов именно Access Violation:

Код
 try
//твой код
 except
   on e:Exception do if e is EAccessViolation then
     Showmessage('AV is occured!')
   else
     raise;
 end;


Этот код даст сообщение если Access Violation и оставит ошибку неотловленной если она другой природы
Добавлено @ 22:18
Цитата(TheAviator @ 7.2.2004, 00:17)
Причину установить не могу, но не влияет на работу проги.


Это не всегда так, зависит что именно с памятью происходит. Например если отключить проверку массивов то следующий код может на ура пройти:

Код
var a:array[1..3] of integer;

...

a[100]:=10;


Но изменённые хрен-знает-где байты могут затереть чего-то относящиеся к соверженно другому и внезапно при каком-то стечении обстоятельств вдруг строка кода типа:

Код
i:=10;


вдруг выдаст Access Violation! Эти ошибки "плавающие" - они могут появлятся или нет в зависимости от погоды, причём выскакивать в самых разных и странных местах. Поэтому такой код который вы написали следует очень-очень внимательно проверять, особенно если возникает AV




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.