Страница 1 из 1
Ссылка на очередь
Добавлено: 22 Июнь 2017, 16:59
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
Ссылка на очередь
Добавлено: 23 Июнь 2017, 14:08
kreator
По хелпу вроде условие "IF Q &= NULL" должно определять протухла ссылка или нет. Или баг именно здесь?
Ссылка на очередь
Добавлено: 23 Июнь 2017, 14:34
Дед Пахом
Не, очередь ссылается на область памяти, которая уже убита.
Admin писал(а): 22 Июнь 2017, 16:59как узнать что ссылка протухла без падения программы?
По-моему, никак не узнать.
Ссылка на очередь
Добавлено: 23 Июнь 2017, 14:48
Yufil
Нет, если объект ликвидирован - ссылки на него останутся. Можно очередь объявить как статическую. Наверное...
Или вместо простой очереди завести объект класса "очередь+ссылка на очередь" , чтобы деструктор (или сгенерированный шаблон) уничтожал ссылку. А в чём сучность задачи?
Ссылка на очередь
Добавлено: 23 Июнь 2017, 17:08
Admin
kreator писал(а): 23 Июнь 2017, 14:08По хелпу вроде условие "IF Q &= NULL" должно определять протухла ссылка или нет. Или баг именно здесь?
Это как бы убогая фича, т.к. кларион не умеет обнулять ссылки на свою выгруженную очередь.
Дед Пахом писал(а): 23 Июнь 2017, 14:34По-моему, никак не узнать.
Примерно так и думал. Жаль!
Yufil писал(а): 23 Июнь 2017, 14:48А в чём сучность задачи?
Сущность в том что хотелось написать класс для дебага очередей. Что бы в разынх методах я мог сделать
а потом вызвать
и посмотреть все переданные очереди.
Но в случае если к примеру я нечаянно передал очередь которая сейчас уже удалена хотел пробежать по списку очередей, проверить на NULL и удалить их что бы не показывать.
Бегу по
и сверяю... а у меня все падает. Вот и все.
Задача решается только так что нужно самому следить за областью видимости передаваемых в класс очередей.
Ссылка на очередь
Добавлено: 23 Июнь 2017, 17:12
Admin
По хорошему нужно к примеру просить у SV отдельную функцию на проверку ссылки.
Это же не нормально что тухлую ссылку никак не узнать и это сразу приводит к падению программы!
Минимальную обработку исключений нужно...
Ссылка на очередь
Добавлено: 23 Июнь 2017, 17:19
Admin
Ссылка на очередь
Добавлено: 23 Июнь 2017, 17:35
Дед Пахом
Ух ты, не знал про этот хук! Правда, пока не могу взять в толк, как им воспользоваться, кроме как тупо протоколировать исключения. То есть, как реально обработать исключение? Если этот хук системный (один на всех)?
Ссылка на очередь
Добавлено: 23 Июнь 2017, 18:40
Yufil
В ABC можно ещё имя процедуры зафиксировать (GlobalErrors.getProcedureName). Наверное, там и стек вызова есть.
Вот при регистрации очереди запомнить имя процедуры. Ну и проверять, есть ли таковая в списке. Гипотетически...
Ссылка на очередь
Добавлено: 24 Июнь 2017, 4:13
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 как то.
Ну и в добавок это немного "не то пальто"
Ссылка на очередь
Добавлено: 27 Июнь 2017, 10:45
Admin
Разобрался
Код: Выделить всё
IF Q &= NULL OR ADDRESS(Q) = 0
! нет ссылки на очередь или она недоступна
END
Ссылка на очередь
Добавлено: 27 Июнь 2017, 10:55
Admin
ага хрена. ложные выводы!
MESSAGE(ADDRESS(Q)) выводит 0 а по факту число есть... через DebugOut показывает
долбаному Клариону срывает мозг!
Ссылка на очередь
Добавлено: 27 Июнь 2017, 18:23
Yufil
Интересно, Address(Q) - адрес поля ссылки или самой очереди? Может быть, просто объявить очереди статическими и не мучиться ?
Ссылка на очередь
Добавлено: 28 Июнь 2017, 2:26
Admin
Yufil писал(а): 27 Июнь 2017, 18:23Address(Q) - адрес поля ссылки или самой очереди
Совпадают.
Но мне для того что я хотел не подходит. Да и ADDRESS(Q) при протухшей ссылке возвращает похоже ахинею.