Различия между Delphi и FPC

Модератор: Модераторы

Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Возможно, я не очень понятно написал. Проблема не в том, что исключение, которое возникло в DLL не обрабатывается корректно в EXE (вернее это тоже проблема, но другого плана). А в том, что в DLL вообще не работает конструкция try-except в случае системных исключений. Т.е. если написать, например:

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

  procedure Test;
  var
    I :Integer;
  begin
    try
        I := 0;
        I := I div I;
    except
    end;
  end;


Если эта функция в EXE - исключение молча погасится. Если в DLL - программа трапнется.

В Delphi это все прекрасно решено. Что касается кросплатформенности - то тут я не особенно рублю, но очевидно, что на платформе, которая не поддерживает системные исключения - и проблемы нет.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Да я понимаю. Просто dll и exe имеют разные стеки фреймов исключений, а должны иметь один общий. В данном случае исключение будет, скорее всего, обрабатываться в .exe, который не имеет информации о dll, поэтому в обработчик в тексте dll оно с гарантией не попадет. Возможно, добавив в exe обертку вокруг вызова Test, можно будет его поймать.

В Дельфи просто используются возможности Windows, которая сама предоставляет каждому потоку стек обработчиков исключений, доступный из exe и dll. В Линуксе и подобных этого нет, но системные исключения есть в виде сигналов. Система исключений FPC больше похожа на то, что в Линуксе.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Я бы сформулировал это иначе - система исключений FPC просто недоделана (содержит ошибки). По крайней мере - на Win-платформе. Код RTL по любому различается для разных платформ - даже для Win32 и Win64. То что задачу можно решить - очевидно (в Delphi она решена). Судя по комментариям - на это просто забили. Сейчас пытаюсь подкрутить сам, если не получится - придется отказаться от использования FPC и ждать Delphi 64. :(

Добавлено спустя 20 часов 20 минут 2 секунды:
Оно еще и не thread-safe но к тому же :evil:
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

есть успехи с исправлением win RTL-a?
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Вообщем, да. Свою задачу я решил. Сделал общий стек исключений + конвертацию объекта Exception при передачи из модуля в модуль (из DLL в DLL или из DLL в EXE). Теперь все работает как в Delphi, с SysUtils вынесенным в package. А что? :)
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

просто интересно:
* решение универсальное, для i386 и 64?
* потокобезопасное?
* был ли создан патч для fpc-rtl? (с оповещением fpc разработчиков) bugs.freepascal.org
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Решение применимо и к x86 и к x64, но оно не является универсальным, потому что требует соблюдения определенных правил при написании программ, в частности головной модуль (exe) должен экспортировать ряд функций, через которые строится общий стек. Может, есть более элегантные способы, но у меня нет на это времени, я решил свою задачу и успокоился.
haword
постоялец
Сообщения: 301
Зарегистрирован: 02.03.2006 10:34:40

Сообщение haword »

ну дак поделись хотя бы примером решения :)
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Еще напоролся: FreePascal при создании нового потока по умолчанию задает ему стек 4M. В delphi было 4К. Чуть не о...ел, когда увидел что мой сервер занимает в памяти несколько гигабайт. :shock:
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Max Rusov
Значение стека поумолчанию:

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

DefaultStackSize = 32768; 

т.е. 32 Кбайта
Если вы укажете параметр StackSize в методе TThread.Create равный 0 то стек будет иметь такой же размер как и основного процесса.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Значит от версии зависит.

FPC 2.3.1, threadh.inc:

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

const
  { includes 16384 bytes margin for stackchecking }
  DefaultStackSize = 4*1024*1024;
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Max Rusov
Похоже, что да. Я смотрел в fpc 2.2.4.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Mr.Smart писал(а):Max Rusov
Если вы укажете параметр StackSize в методе TThread.Create равный 0 то стек будет иметь такой же размер как и основного процесса.
Как такое прописать без патчей исходников FPC? Нужно одному из потоков выделить 36-40 мегабайт памяти чтобы он не забирал/возращал её динамически. Радости от того что он её возвращает, сегментирует а потом опять забирает нет никакой.
Ответить