Ссылка на очередь

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

Как пофиксить?
Точнее как узнать что ссылка протухла без падения программы?

Код: Выделить всё

Q                       &QUEUE 

  CODE      
  InProcedure
  IF Q &= NULL        ! тут не NULL :-(
    STOP('NULL')
  END
  MESSAGE(RECORDS(Q)) ! падаем тут
    
InProcedure             PROCEDURE
TestQueue               QUEUE
Var1                      BYTE
                        END
  CODE      
  Q &= TestQueue
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Ссылка на очередь

Сообщение kreator »

По хелпу вроде условие "IF Q &= NULL" должно определять протухла ссылка или нет. Или баг именно здесь?
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылка на очередь

Сообщение Дед Пахом »

Не, очередь ссылается на область памяти, которая уже убита.
Admin писал(а): 22 Июнь 2017, 16:59как узнать что ссылка протухла без падения программы?
По-моему, никак не узнать.
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Ссылка на очередь

Сообщение Yufil »

Нет, если объект ликвидирован - ссылки на него останутся. Можно очередь объявить как статическую. Наверное...
Или вместо простой очереди завести объект класса "очередь+ссылка на очередь" , чтобы деструктор (или сгенерированный шаблон) уничтожал ссылку. А в чём сучность задачи?
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

kreator писал(а): 23 Июнь 2017, 14:08По хелпу вроде условие "IF Q &= NULL" должно определять протухла ссылка или нет. Или баг именно здесь?
Это как бы убогая фича, т.к. кларион не умеет обнулять ссылки на свою выгруженную очередь.
Дед Пахом писал(а): 23 Июнь 2017, 14:34По-моему, никак не узнать.
Примерно так и думал. Жаль!
Yufil писал(а): 23 Июнь 2017, 14:48А в чём сучность задачи?
Сущность в том что хотелось написать класс для дебага очередей. Что бы в разынх методах я мог сделать

Код: Выделить всё

DebugQueueClass.Add(Queue)
а потом вызвать

Код: Выделить всё

DebugQueueClass.Show()
и посмотреть все переданные очереди.
Но в случае если к примеру я нечаянно передал очередь которая сейчас уже удалена хотел пробежать по списку очередей, проверить на NULL и удалить их что бы не показывать.
Бегу по

Код: Выделить всё

QUEUE
Q &QUEUE
END
и сверяю... а у меня все падает. Вот и все.
Задача решается только так что нужно самому следить за областью видимости передаваемых в класс очередей.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

По хорошему нужно к примеру просить у SV отдельную функцию на проверку ссылки.
Это же не нормально что тухлую ссылку никак не узнать и это сразу приводит к падению программы!
Минимальную обработку исключений нужно...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылка на очередь

Сообщение Дед Пахом »

Ух ты, не знал про этот хук! Правда, пока не могу взять в толк, как им воспользоваться, кроме как тупо протоколировать исключения. То есть, как реально обработать исключение? Если этот хук системный (один на всех)?
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Ссылка на очередь

Сообщение Yufil »

В ABC можно ещё имя процедуры зафиксировать (GlobalErrors.getProcedureName). Наверное, там и стек вызова есть.
Вот при регистрации очереди запомнить имя процедуры. Ну и проверять, есть ли таковая в списке. Гипотетически...
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

Дед Пахом писал(а): 23 Июнь 2017, 17:35Ух ты, не знал про этот хук
Сам не знал. Чейнджлоги не читаю.
Пробовал код отсюда http://clarionsharp.com/blog/lastchancehook/

Код: Выделить всё

    PROGRAM
    INCLUDE('CWEXCPT.INT'), ONCE
    INCLUDE('svapi.inc')
    MAP
      INCLUDE('svapifnc.inc')
      Hook(*ICWExceptionInfo), LONG
      Test(LONG,LONG)
      HEX (LONG),STRING,PRIVATE
    END

  CODE
  MESSAGE('Start')
  SYSTEM{PROP:LastChanceHook} = ADDRESS(Hook)
  Test(10, 0)
  MESSAGE('End')
  RETURN

Hook    PROCEDURE(*ICWExceptionInfo info)
S       CSTRING(1024)
Caption CSTRING(256)
  CODE
  IF info &= NULL
    RETURN 0
  END
  Caption = 'Exception ' & HEX (info.ExceptionCode()) & ' at ' & HEX (info.ExceptionAddress())
  S = 'Registers' & |
  '<13,10>EAX=' & HEX (info.Register (i386_Register:Reg32_EAX)) & |
  ' EBX=' & HEX (info.Register (i386_Register:Reg32_EBX)) & |
  ' ECX=' & HEX (info.Register (i386_Register:Reg32_ECX)) & |
  ' EDX=' & HEX (info.Register (i386_Register:Reg32_EDX)) & |
  '<13,10>ESI=' & HEX (info.Register (i386_Register:Reg32_ESI)) & |
  ' EDI=' & HEX (info.Register (i386_Register:Reg32_EDI)) & |
  ' ESP=' & HEX (info.Register (i386_Register:Reg32_ESP)) & |
  ' EBP=' & HEX (info.Register (i386_Register:Reg32_EBP)) & |
  '<13,10,13,10>Current thread is being terminated'
  MessageBox (0, S, Caption, MB_ICONHAND)
  RETURN 1

Test    PROCEDURE (LONG a, LONG b)
  CODE
  a %= b

HEX     PROCEDURE (LONG A)
i       UNSIGNED,AUTO
S       STRING(8),AUTO
DIGITS  STRING('0123456789ABCDEF'),STATIC
  CODE
  i = SIZE(S)
  LOOP WHILE i <> 0
    S [i] = DIGITS [BAND (A, 0Fh) + 1]
    A = BSHIFT (A, -4)
    i -= 1
  END
  RETURN S
Но, не появляется сообщение. WerFault в Windows 10 перехватывает Exception как то.
Ну и в добавок это немного "не то пальто"
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

Разобрался

Код: Выделить всё

IF Q &= NULL OR ADDRESS(Q) = 0
  ! нет ссылки на очередь или она недоступна
END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

ага хрена. ложные выводы!
MESSAGE(ADDRESS(Q)) выводит 0 а по факту число есть... через DebugOut показывает
долбаному Клариону срывает мозг!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Ссылка на очередь

Сообщение Yufil »

Интересно, Address(Q) - адрес поля ссылки или самой очереди? Может быть, просто объявить очереди статическими и не мучиться ?
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Ссылка на очередь

Сообщение Admin »

Yufil писал(а): 27 Июнь 2017, 18:23Address(Q) - адрес поля ссылки или самой очереди
Совпадают.
Но мне для того что я хотел не подходит. Да и ADDRESS(Q) при протухшей ссылке возвращает похоже ахинею.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить