Страница 2 из 2

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

СообщениеДобавлено: 08.07.2009 14:39:25
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 это все прекрасно решено. Что касается кросплатформенности - то тут я не особенно рублю, но очевидно, что на платформе, которая не поддерживает системные исключения - и проблемы нет.

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

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

В Дельфи просто используются возможности Windows, которая сама предоставляет каждому потоку стек обработчиков исключений, доступный из exe и dll. В Линуксе и подобных этого нет, но системные исключения есть в виде сигналов. Система исключений FPC больше похожа на то, что в Линуксе.

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

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

Добавлено спустя 20 часов 20 минут 2 секунды:
Оно еще и не thread-safe но к тому же :evil:

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

СообщениеДобавлено: 28.07.2009 15:16:22
скалогрыз
есть успехи с исправлением win RTL-a?

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

СообщениеДобавлено: 28.07.2009 15:58:54
Max Rusov
Вообщем, да. Свою задачу я решил. Сделал общий стек исключений + конвертацию объекта Exception при передачи из модуля в модуль (из DLL в DLL или из DLL в EXE). Теперь все работает как в Delphi, с SysUtils вынесенным в package. А что? :)

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

СообщениеДобавлено: 28.07.2009 16:41:05
скалогрыз
просто интересно:
* решение универсальное, для i386 и 64?
* потокобезопасное?
* был ли создан патч для fpc-rtl? (с оповещением fpc разработчиков) bugs.freepascal.org

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

СообщениеДобавлено: 28.07.2009 17:27:07
Max Rusov
Решение применимо и к x86 и к x64, но оно не является универсальным, потому что требует соблюдения определенных правил при написании программ, в частности головной модуль (exe) должен экспортировать ряд функций, через которые строится общий стек. Может, есть более элегантные способы, но у меня нет на это времени, я решил свою задачу и успокоился.

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

СообщениеДобавлено: 29.07.2009 10:22:44
haword
ну дак поделись хотя бы примером решения :)

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

СообщениеДобавлено: 03.09.2009 14:27:58
Max Rusov
Еще напоролся: FreePascal при создании нового потока по умолчанию задает ему стек 4M. В delphi было 4К. Чуть не о...ел, когда увидел что мой сервер занимает в памяти несколько гигабайт. :shock:

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

СообщениеДобавлено: 03.09.2009 14:52:19
Mr.Smart
Max Rusov
Значение стека поумолчанию:
Код: Выделить всё
DefaultStackSize = 32768;

т.е. 32 Кбайта
Если вы укажете параметр StackSize в методе TThread.Create равный 0 то стек будет иметь такой же размер как и основного процесса.

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

СообщениеДобавлено: 03.09.2009 15:13:54
Max Rusov
Значит от версии зависит.

FPC 2.3.1, threadh.inc:

Код: Выделить всё
const
  { includes 16384 bytes margin for stackchecking }
  DefaultStackSize = 4*1024*1024;

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

СообщениеДобавлено: 03.09.2009 15:15:51
Mr.Smart
Max Rusov
Похоже, что да. Я смотрел в fpc 2.2.4.

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

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