AV в логах сервера сервер падает Что делать?
AV в логах сервера сервер падает Что делать?
Сервер IB 7.5.1
Эксплуатируется уже около года, периодически падал, сегодня анализирую логи: постоянно валятся ошибки:
Access violation.
The code attempted to access a virtual
address without privilege to do so.
или
An exception occurred that does
not have a description. Exception number EEDFADE.
Далее следует:
DB03_001 (Client) Thu Jun 19 13:10:28 2008
C:\Program Files\Borland\InterBase\bin\ibserver.exe: terminated abnormally (-1)
иногда перед ошибкой зафиксировано имя ХП или запрос, иногда пусто
часть ХП имеют обращение к UDF, часть нет, есть селективные ХП и запросы, есть исполняемые, процедуры к разным БД (сопровождается 5 БД).
Подскажите, что за беда и как бороться?
(AV полученная из UDF приводит к такой фигне и падению одназначно, проверено, но вот остальные, которые к UDF не обращаются...)
Эксплуатируется уже около года, периодически падал, сегодня анализирую логи: постоянно валятся ошибки:
Access violation.
The code attempted to access a virtual
address without privilege to do so.
или
An exception occurred that does
not have a description. Exception number EEDFADE.
Далее следует:
DB03_001 (Client) Thu Jun 19 13:10:28 2008
C:\Program Files\Borland\InterBase\bin\ibserver.exe: terminated abnormally (-1)
иногда перед ошибкой зафиксировано имя ХП или запрос, иногда пусто
часть ХП имеют обращение к UDF, часть нет, есть селективные ХП и запросы, есть исполняемые, процедуры к разным БД (сопровождается 5 БД).
Подскажите, что за беда и как бороться?
(AV полученная из UDF приводит к такой фигне и падению одназначно, проверено, но вот остальные, которые к UDF не обращаются...)
уже был такой вопрос. см. сюда:
http://forum.ibase.ru/phpBB2/viewtopic.php?t=2010
т.е. это стопудово ошибка в udf dll.
http://forum.ibase.ru/phpBB2/viewtopic.php?t=2010
т.е. это стопудово ошибка в udf dll.
я написала в посте, что вызов AV в UDF нормально и стабильно приводит к такой ошибке и падению сервера, но тогда падали бы строго определенные процедуры вызывающие "плохую" udf меня как раз больше интересует вопрос почему вот это в логе:kdv писал(а): т.е. это стопудово ошибка в udf dll.
OBOROT_GROUP_DATE2
Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the InterBase server
где OBOROT_GROUP_DATE2 имя ХП, которая просто выбирает данные из таблиц и ни к каким библиотекам не обращается. И почему эта процедура не отваливается при каждом запуске, а запускаться должна раз по 10 на дню точно, а шибок таких 4 за год.
Вот еще из известной статьи с этого ресурса:
Внимание!: для правильной работы UDF в IB 4.2 и 5.x в инициализации DLL должна быть обязательно написана фраза IsMultiThread:=True; В противном случае при одновременном вызове udf несколькими пользователями в interbase.log будут появляться сообщения об ошибке "SCH_validate - …", или возможна порча памяти сервера с неприятными последствиями для базы данных.
это для 7.5.1 справедливо?
Внимание!: для правильной работы UDF в IB 4.2 и 5.x в инициализации DLL должна быть обязательно написана фраза IsMultiThread:=True; В противном случае при одновременном вызове udf несколькими пользователями в interbase.log будут появляться сообщения об ошибке "SCH_validate - …", или возможна порча памяти сервера с неприятными последствиями для базы данных.
это для 7.5.1 справедливо?
Re: AV в логах сервера сервер падает Что делать?
Однозначно - необработанное дельфийское исключение.SlyTanys писал(а):An exception occurred that does
not have a description. Exception number EEDFADE.
неясно, зачем копаться в потоконебезопасном этом самом.
суперсервер - это процесс с тучей тредов. которые могут вызывать udf.
следовательно, в udf должно быть написано isMultiThread:=True. Причем, это все равно не гарантирует потокобезопасность при вызове определенных функций RTL, WinAPI или своих функций, например обращающихся ... к глобальным переменным в UDF.
для классика все это необязательно.
и, насчет ib_malloc - эта функция введена не для мультитредовости, а для совместимости с рантаймом конкретного IB/FB, для функций с FREE_IT. Объясняется в FAQ.
суперсервер - это процесс с тучей тредов. которые могут вызывать udf.
следовательно, в udf должно быть написано isMultiThread:=True. Причем, это все равно не гарантирует потокобезопасность при вызове определенных функций RTL, WinAPI или своих функций, например обращающихся ... к глобальным переменным в UDF.
для классика все это необязательно.
и, насчет ib_malloc - эта функция введена не для мультитредовости, а для совместимости с рантаймом конкретного IB/FB, для функций с FREE_IT. Объясняется в FAQ.
можно, но практического смысла нет. потому что обработать не получится. exception уйдет в код сервера. а что сервер должен с ним делать?Еще такой вопрос, можно ли в функции UDF возбудить исключительную ситуацию и каким то образом обработать при вызове?
вообще такой вопрос косвенно означает, что Вы и exception обрабатывать не умеете, как и работать с dll.
Я вообще много чего не умею, поэтому задаю вопросы, если бы умела - не задавала, логично?
если вам нетрудно, то помогите мне еще немного:
про исключение я имела в виду следующее. В библиотеке есть функция, которая при неверном значении входного параметра возбужает исключительную ситуацию (raise). Если эту функцию вызвать с соответствующим значением параметра, то в логе сервера мы видим:
An exception occurred that does
not have a description. Exception number EEDFADE.
This exception will cause the InterBase server
to terminate abnormally.
ну и соответственно сервер падает.
Функция вызывается в обычном запросе select. Вопрос собственно, что можно сделать (и можно ли вообще), чтобы сервер при получении исключительной ситуации из dll не умирал?
если вам нетрудно, то помогите мне еще немного:
про исключение я имела в виду следующее. В библиотеке есть функция, которая при неверном значении входного параметра возбужает исключительную ситуацию (raise). Если эту функцию вызвать с соответствующим значением параметра, то в логе сервера мы видим:
An exception occurred that does
not have a description. Exception number EEDFADE.
This exception will cause the InterBase server
to terminate abnormally.
ну и соответственно сервер падает.
Функция вызывается в обычном запросе select. Вопрос собственно, что можно сделать (и можно ли вообще), чтобы сервер при получении исключительной ситуации из dll не умирал?
ничего. exception в dll/udf для сервера это сигнал об ошибке. dll выполняется в сегменте кода сервера, поэтому дальнейшее продолжение работы опасно. И серверу все равно - exception возник случайно или намеренно.Вопрос собственно, что можно сделать (и можно ли вообще), чтобы сервер при получении исключительной ситуации из dll не умирал?
решение одно - переписать udf, так чтобы никакие exception наружу не передавались.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05