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

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

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

Сообщение Max Rusov » 08.07.2009 14:39:25

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

Код: Выделить всё
  procedure Test;
  var
    I :Integer;
  begin
    try
        I := 0;
        I := I div I;
    except
    end;
  end;


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

В Delphi это все прекрасно решено. Что касается кросплатформенности - то тут я не особенно рублю, но очевидно, что на платформе, которая не поддерживает системные исключения - и проблемы нет.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

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

Сообщение Sergei I. Gorelkin » 08.07.2009 18:45:25

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

В Дельфи просто используются возможности Windows, которая сама предоставляет каждому потоку стек обработчиков исключений, доступный из exe и dll. В Линуксе и подобных этого нет, но системные исключения есть в виде сигналов. Система исключений FPC больше похожа на то, что в Линуксе.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение Max Rusov » 08.07.2009 19:09:15

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

Добавлено спустя 20 часов 20 минут 2 секунды:
Оно еще и не thread-safe но к тому же :evil:
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

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

Сообщение скалогрыз » 28.07.2009 15:16:22

есть успехи с исправлением win RTL-a?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Max Rusov » 28.07.2009 15:58:54

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

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

Сообщение скалогрыз » 28.07.2009 16:41:05

просто интересно:
* решение универсальное, для i386 и 64?
* потокобезопасное?
* был ли создан патч для fpc-rtl? (с оповещением fpc разработчиков) bugs.freepascal.org
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Max Rusov » 28.07.2009 17:27:07

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

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

Сообщение haword » 29.07.2009 10:22:44

ну дак поделись хотя бы примером решения :)
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

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

Сообщение Max Rusov » 03.09.2009 14:27:58

Еще напоролся: FreePascal при создании нового потока по умолчанию задает ему стек 4M. В delphi было 4К. Чуть не о...ел, когда увидел что мой сервер занимает в памяти несколько гигабайт. :shock:
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

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

Сообщение Mr.Smart » 03.09.2009 14:52:19

Max Rusov
Значение стека поумолчанию:
Код: Выделить всё
DefaultStackSize = 32768;

т.е. 32 Кбайта
Если вы укажете параметр StackSize в методе TThread.Create равный 0 то стек будет иметь такой же размер как и основного процесса.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Max Rusov » 03.09.2009 15:13:54

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

FPC 2.3.1, threadh.inc:

Код: Выделить всё
const
  { includes 16384 bytes margin for stackchecking }
  DefaultStackSize = 4*1024*1024;
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

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

Сообщение Mr.Smart » 03.09.2009 15:15:51

Max Rusov
Похоже, что да. Я смотрел в fpc 2.2.4.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Сквозняк » 16.03.2011 06:35:51

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

Пред.

Вернуться в IDE, компилятор, отладчик

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru