Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Дополнительная информация при ошибке в UDF / 25 сообщений из 52, страница 1 из 3
22.12.2015, 03:35
    #39134020
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
Сегодня приключилась вот такая ситуация:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
BADGER (Server)	Tue Dec 22 10:20:02 2015
	The user defined function: 	FORMAT_DATE
	   referencing entrypoint: 	FormatDate                     
	                in module: 	gm_udf
	caused the fatal exception: Access violation.
		The code attempted to access a virtual
		address without privilege to do so.
	This exception will cause the Firebird server
	to terminate abnormally.


BADGER (Server)	Tue Dec 22 10:20:02 2015
	Shutting down the server with 48 active connection(s) to 2 database(s), 0 active service(s)

Вопрос разработчикам: можно ли расширить эти сообщения, чтобы в первом случае сообщалось, под каким пользователем выполнялся запрос с этой UDF и в какой базе, а во втором случае, какие именно базы были закрыты.
...
Рейтинг: 0 / 0
22.12.2015, 08:43
    #39134103
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
CyberMaxпод каким пользователем выполнялся запрос с этой UDF и в какой базе, а во втором случае, какие именно базы были закрыты.
Кривая udf завалит любой сервер.

П.С. Ставлю рубль на то, что "formatdate" просто написана криво, потому что сервер вряд-ли дает ей кривые данные...
...
Рейтинг: 0 / 0
22.12.2015, 08:52
    #39134111
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
wadman,

Сервер в лице какого-то пользователя (разработчика) передал туда кривые данные. Я хочу знать, кто это был, чтобы выяснить, что там такое было, и на какой базе.
P.S. С ошибкой в UDF, конечно же, разберемся.
...
Рейтинг: 0 / 0
22.12.2015, 08:56
    #39134115
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
CyberMaxСервер в лице какого-то пользователя (разработчика) передал туда кривые данные.
Давай рассмотрим с другой стороны: что туда можно передать кривого? Пустую строку?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function DateTimeToChar(var IBDateTime: TIBDateTime; sz: PAnsiChar): PAnsiChar; cdecl; export;
var d: TDateTime;
    u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    with IBDateTime do
        d := Days - IBDateDelta + MSec10 / MSecsPerDay10;
    u := FormatDateTime(UTF8String(sz), d, fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;


Дак и на выходе будет пустая строка.
...
Рейтинг: 0 / 0
22.12.2015, 10:03
    #39134162
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
CyberMax, к сожалению, чтобы udf могла автоматически (без явной передачи через аргументы) получать хоть какую-то информацию от сервера, надо расширять функционал ib_util.dll. Иначе - только через аргументы функции.
...
Рейтинг: 0 / 0
22.12.2015, 10:06
    #39134166
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
wadman,

Камрад, ты чего оффтопишь? Какая разница, что там в UDF? Это может быть абсолютно любая функция, в том числе состоящая из строки raise Exception.Create. Я спрашиваю про расширение диагностики от сервера, а не про то, как написать функцию, в которой не будет необработанных исключений.
...
Рейтинг: 0 / 0
22.12.2015, 10:08
    #39134168
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
DBConstructorCyberMax, к сожалению, чтобы udf могла автоматически (без явной передачи через аргументы) получать хоть какую-то информацию от сервера, надо расширять функционал ib_util.dll. Иначе - только через аргументы функции.
Сообщение в логе формирует сервер в момент падения. Вопрос: при чем тут передача информации от сервера в UDF?
...
Рейтинг: 0 / 0
22.12.2015, 10:13
    #39134172
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
DBConstructor,

в UDR (FB 3) можно получить любую инфу от сервера без проблем. Но их надо научится готовить. Это немного сложнее чем написать UDF.
...
Рейтинг: 0 / 0
22.12.2015, 10:15
    #39134175
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
CyberMax,

не факт что в момент падения можно вытащить информацию о пользователе который его вызвал
...
Рейтинг: 0 / 0
22.12.2015, 10:18
    #39134178
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
CyberMax, если udf функция может поймать исключение через try/catch блок и обработать, то достаточно получить информацию о контексте транзакции и сохранить необходимую информацию в журнал событий. Вопрос только в том, как получить информацию о контексте транзакции.
...
Рейтинг: 0 / 0
22.12.2015, 10:19
    #39134179
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
Симонов ДенисDBConstructor, в UDR (FB 3) можно получить любую инфу от сервера без проблем. Но их надо научится готовить. Это немного сложнее чем написать UDF.
Обнадёживающе.
...
Рейтинг: 0 / 0
22.12.2015, 10:25
    #39134182
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
DBConstructorCyberMax, если udf функция может поймать исключение через try/catch блок и обработать, то достаточно получить информацию о контексте транзакции и сохранить необходимую информацию в журнал событий. Вопрос только в том, как получить информацию о контексте транзакции.
Какой еще журнал событий? Какой контекст транзакции? Ты тычешь пальцем в небо.
...
Рейтинг: 0 / 0
22.12.2015, 10:50
    #39134202
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
>fatal exception: Access violation.

Гарантированно только дамп можно получить, и из него выколупывать.

Кибермах 5й год сногается с gm_udf, судя по форуму.

P.S. Весьма плохая идея совать внутрь сервера (любого процесса) код от другого компилятора.
...
Рейтинг: 0 / 0
22.12.2015, 10:56
    #39134208
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
CyberMaxКакой еще журнал событий?
Любой. В таком варианте хоть на syslogd отправляй - без разницы.
Но было бы идеально, если бы ib_util предоставляла возможность записи в log файл сервера Firebird.

CyberMaxКакой контекст транзакции?
Идентификатор пользователя, идентификатор транзакции и т.д.
...
Рейтинг: 0 / 0
22.12.2015, 10:59
    #39134212
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
ЗимарглP.S. Весьма плохая идея совать внутрь сервера (любого процесса) код от другого компилятора.
Интересное мнение... Обоснуй.
...
Рейтинг: 0 / 0
22.12.2015, 11:07
    #39134226
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
DBConstructorЗимарглP.S. Весьма плохая идея совать внутрь сервера (любого процесса) код от другого компилятора.
Интересное мнение... Обоснуй.
"У меня не получилось". (с)
...
Рейтинг: 0 / 0
22.12.2015, 11:10
    #39134231
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
ЗимарглГарантированно только дамп можно получить, и из него выколупывать.
Не надо никакого дампа.

ЗимарглКибермах 5й год сногается с gm_udf, судя по форуму.
Дык. Сам пишу - сам сношаюсь же.

ЗимарглP.S. Весьма плохая идея совать внутрь сервера (любого процесса) код от другого компилятора.
Какого другого? dll состоит из машинного кода, который все равно, чем и как сформирован.
...
Рейтинг: 0 / 0
22.12.2015, 11:13
    #39134234
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
DBConstructor,

Я тебя умоляю, не пиши в эту тему больше.
...
Рейтинг: 0 / 0
22.12.2015, 11:21
    #39134240
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
фигней занимаетесь, господа )))
вот сделать obj client для компиляции в ехе было бы классно
...
Рейтинг: 0 / 0
22.12.2015, 11:29
    #39134256
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
CyberMaxЗимарглP.S. Весьма плохая идея совать внутрь сервера (любого процесса) код от другого компилятора.
Какого другого? dll состоит из машинного кода, который все равно, чем и как сформирован.
Судя по статистике, многие не понимают промежуточные этапы, что именно "отсебя" добавляет компилятор в машинный код. Не учитывают ньюансы и в итоге подобные проблемы. А ньюансов много.

Была статья на stackoveflow, Но сходу повторно не нашел.

Вкратце, что по разному обрабатывается - классы, стек, потоки, исключения, динамическая память. Наверняка что то спросонья еще забыл.

На этом же форуме много раз писали правильную вещь - избавляйтесь от UDF.
...
Рейтинг: 0 / 0
22.12.2015, 11:31
    #39134260
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
DBConstructorCyberMaxКакой контекст транзакции?
Идентификатор пользователя, идентификатор транзакции и т.д.

никто не будет это делать для UDF. UDF имеют множество ограничений и на данный момент это считается Legacy внешними функциями. В UDR это уже есть. На Delphi их тоже можно писать. Сейчас как раз с этим разбираюсь. Даже кое-что удалось сделать.

Кстати я сомневаюсь что ты сможешь перехватить Access violation в коде UDF
...
Рейтинг: 0 / 0
22.12.2015, 11:36
    #39134269
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
Симонов ДенисКстати я сомневаюсь что ты сможешь перехватить Access violation в коде UDF
Т.е. обращение по нулевому указателю я могу поймать в try блоке, а "Access violation" нет?
...
Рейтинг: 0 / 0
22.12.2015, 11:47
    #39134288
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
Симонов ДенисКстати я сомневаюсь что ты сможешь перехватить Access violation в коде UDF
Можно. Это обычное исключение.
...
Рейтинг: 0 / 0
22.12.2015, 11:53
    #39134296
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
DBConstructor,

а где гарантия что Access violation произошёл внутри UDF, а не в момент освобождения выделенной в ней памяти движком FB? Хотя текст ошибки вроде указывает на это.
...
Рейтинг: 0 / 0
22.12.2015, 12:01
    #39134304
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнительная информация при ошибке в UDF
Симонов Денис,

Денис, чего ты за AV зацепился? FB падает при любом необработанном исключении в udf.

С другой стороны, кто-нибудь может сказать, зачем FB вообще падает? При вызове UDF достаточно же сделать try/catch, не?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Дополнительная информация при ошибке в UDF / 25 сообщений из 52, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]