Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
Delphi XE3 unit System
finalization
{$IFDEF WEAKREF}
  Finalize(InstHashMap);
{$ENDIF}
  Close(Input);
  Close(Output);
  Close(ErrOutput);
{$IFDEF LINUX}
  ReleaseZeroPage;
{$ENDIF LINUX}
{$IFDEF POSIX}
  if InternalUTF8CompareLocale <> nil then
    freelocale(InternalUTF8CompareLocale);
{$ENDIF POSIX}
{$IFDEF MSWINDOWS}
  FinalizeLocaleDate;
  if PreferredLanguagesOverride <> nil then
    FreeMem(PreferredLanguagesOverride);
  {Uninitialize the default memory manager, and free all memory allocated by
   this memory manager.}
  FinalizeMemoryManager;
{$ENDIF MSWINDOWS}
end.
Т.е. finalization FastMM уже вызван, менеджер памяти уже снесен, а тут тебе FreeMem(). Сюрприз! FreeMem вызывается только если PreferredLanguagesOverride <> nil, он заполняется из раздела реестра HKEY_CURRENT_USER\Software\Embarcadero\Locales. Там записано десяток программ, в том числе и bds.exe.

Проблема у меня проявилась после инсталляции моего ActiveX как компонента в IDE.

Один из способов обхода проблемы (кроме забить) - это компильнуть отдельную версию ActiveX специально для IDE с опцией NeverUninstall

С уважением, Vasilisk
24 июн 15, 18:40    [17812643]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
defecator
Member

Откуда:
Сообщений: 39386
В XE7 ровно то же самое:

finalization
{$IFDEF WEAKREF}
  InstHashMap.Finalize;
{$ENDIF}
  Close(Input);
  Close(Output);
  Close(ErrOutput);
{$IFDEF LINUX}
  ReleaseZeroPage;
{$ENDIF LINUX}
{$IF defined(USE_LIBICU)}
  FreeMem(InternalUTF8CompareLocale);
{$ELSEIF defined(POSIX)}
  if InternalUTF8CompareLocale <> nil then
    freelocale(InternalUTF8CompareLocale);
{$ENDIF defined(POSIX)}
{$IFDEF MSWINDOWS}
  FinalizeLocaleDate;
  if PreferredLanguagesOverride <> nil then
    FreeMem(PreferredLanguagesOverride);
  {Uninitialize the default memory manager, and free all memory allocated by
   this memory manager.}
  FinalizeMemoryManager;
{$ENDIF MSWINDOWS}
{$IFDEF USE_LIBICU}
  if LastConverter <> nil then
    ucnv_close(LastConverter);
{$ENDIF MSWINDOWS}
end.
24 июн 15, 18:46    [17812658]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
defecator
В XE7 ровно то же самое:
Еще и усугубили вторым FreeMem.

В 2007 все было номально
24 июн 15, 19:13    [17812736]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
_Vasilisk_
Т.е. finalization FastMM уже вызван, менеджер памяти уже снесен, а тут тебе FreeMem().

Там FastMM интегрирован в system.pas ({$I GETMEM.INC}), поэтому собственной финализационной части не имеет.
24 июн 15, 20:19    [17812900]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
Kazantsev Alexey,

Этот код лишает возможности использовать любой альтернативный менеджер памяти. Т.к. память под PreferredLanguagesOverride будет выделяться одним менеджером, а освобождаться другим
24 июн 15, 23:10    [17813304]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1614
_Vasilisk_
Kazantsev Alexey,

Этот код лишает возможности использовать любой альтернативный менеджер памяти. Т.к. память под PreferredLanguagesOverride будет выделяться одним менеджером, а освобождаться другим

ничего не лишается...
ваш менеджер памяти после выгрузки должен вернуть старый который и освободит память которую занял

стандартный - старт
...
ваш - старт
...
ваш - финиш
...
стандартный - финиш
24 июн 15, 23:39    [17813345]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
X-Cite
ничего не лишается...
Еще раз
_Vasilisk_
память под PreferredLanguagesOverride будет выделяться одним менеджером, а освобождаться другим
стандартный - старт
ваш - старт
выделение моим менеджером памяти под PreferredLanguagesOverride
ваш - финиш
освобождение стандартным менеджером PreferredLanguagesOverride
стандартный - финиш

объяснять, почему это работать не будет?
25 июн 15, 00:29    [17813404]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
_Vasilisk_
Этот код лишает возможности использовать любой альтернативный менеджер памяти. Т.к. память под PreferredLanguagesOverride будет выделяться одним менеджером, а освобождаться другим

PreferredLanguagesOverride инициализируется при старте приложения, когда используется ещё дефолтный менеджер. Ну и зафиналится она тоже дефолтным, т.к. к моменту вызова FreeMem сторонний менеджер уже завершит свою работу и восстановит дефолтный. Другое дело, что подобный механизм переинициализации сам по себе уязвим, т.к. после смены менеджера можно закрешить приложение просто вызвав SetLocaleOverride, что естественно приведет к сбою.
25 июн 15, 00:37    [17813415]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
Kazantsev Alexey
PreferredLanguagesOverride инициализируется при старте приложения, когда используется ещё дефолтный менеджер.
В том-то и дело, что нет
25 июн 15, 00:39    [17813416]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
_Vasilisk_
В том-то и дело, что нет
По крайней мере в XE3
25 июн 15, 00:40    [17813417]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
_Vasilisk_
В том-то и дело, что нет

Поставь бряк на GetLocaleOverride и посмотри откуда идёт первый вызов. Если в реестре запись есть - переменная будет инициализирована, если нет - останется пустой. Другое дело, что можно запись в реестре создать после старта приложения, когда менеджер уже будет изменен, и некоторыми действиями спровоцировать переинициализацию.
25 июн 15, 00:54    [17813437]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
Kazantsev Alexey
Поставь бряк на GetLocaleOverride и посмотри откуда идёт первый вызов
Ставил. Откуда вызов не смотрел, но вызывается уже новый менеджер. Завтра укажу стек вызовов
25 июн 15, 00:59    [17813443]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
_Vasilisk_
Ставил. Откуда вызов не смотрел, но вызывается уже новый менеджер. Завтра укажу стек вызовов

Я сейчас проверил на XE3. Если менеджер памяти не использует sysutils то его инициализация отрабатывает раньше (модуль менеджера первый в списке модулей проекта) первого вызова GetLocaleOverride, если sysutils подключить то GetLocaleOverride вызывается раньше.
25 июн 15, 01:15    [17813458]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
Kazantsev Alexey
Я сейчас проверил на XE3. Если менеджер памяти не использует sysutils
Кто же будет в менеджерере поключать SysUtils?
А стек такой
SysUtils подключает System.Internal.ExcUtils, тот подключает SysConst, где объявлены resourcestring и дальше по стеку
автор
System.SetLocaleOverride('')
System.GetLocaleOverride('My.exe')
System.GetResourceModuleName('My.exe','My.exe')
System.LoadResourceModule('My.exe',???)
System.DelayLoadResourceModule($AF4C44)
System.FindResourceHInstance(???)
System.LoadResString($41A26C)
System.LoadResStringU($41A26C)
System._InitResStringImports(???)
25 июн 15, 12:42    [17814976]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48796

_Vasilisk_
Кто же будет в менеджерере поключать SysUtils?

Тот, кто хочет выкидывать EOutOfMemory?..

Posted via ActualForum NNTP Server 1.5

25 июн 15, 12:49    [17815020]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
Dimitry Sibiryakov
Тот, кто хочет выкидывать EOutOfMemory?..
unit System
function _GetMem(Size: NativeInt): Pointer;
{$IFDEF PUREPASCAL}
begin
  if Size <= 0 then
    Exit(nil);
  Result := MemoryManager.GetMem(Size);
  if Result = nil then
    Error(reOutOfMemory);
end;
{$ELSE !PUREPASCAL}
25 июн 15, 12:55    [17815053]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
_Vasilisk_, я в своём мониторящем менеджере использую. Без sysutils нет поддержки исключений.
25 июн 15, 13:06    [17815117]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11324
Kazantsev Alexey
Без sysutils нет поддержки исключений.
Я знаю. Но зачем поддержка исключений, если достаточно вернуть nil и OutOfMemory всплывет из System?
25 июн 15, 13:27    [17815254]     Ответить | Цитировать Сообщить модератору
 Re: Грабли с FastMM + bds.exe  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
_Vasilisk_
Я знаю. Но зачем поддержка исключений, если достаточно вернуть nil и OutOfMemory всплывет из System?

Я не про EOutOfMemory. У меня там внутренней каши полно. А для задействования SysUtils достаточно просто начать использовать платформо-независимые примитивы синхронизации из SyncObjs.
25 июн 15, 14:10    [17815546]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Грабли с FastMM + bds.exe  [new]
GunSmoker
Member

Откуда:
Сообщений: 3110
В копилку чудес:

Там ещё первым действием идёт Finalize(InstHashMap)/InstHashMap.Finalize - а это освобождение памяти под weak ref-s, выделение для которого может быть в произвольном месте программы.

Например, FMX:

  • System.AllocMem
  • System.TMonitor.Create
  • System.TInstHashMap.Initialize
  • System.TInstHashMap.RegisterWeakRef
  • System.RegisterWeakRef
  • System._IntfWeakCopy
  • FMX.ListBox.{FMX.Controls}TContentInflater<FMX.ListBox.TListBoxItem>.Create
  • System.Classes.CreateComponent
  • System.Classes.TReader.ReadComponent
  • System.Classes.TReader.ReadDataInner
  • System.Classes.TReader.ReadData
  • System.Classes.TComponent.ReadState
  • System.Classes.TReader.ReadRootComponent
  • System.Classes.TStream.ReadComponent
  • System.Classes.InternalReadComponentRes
  • System.Classes.InitComponent
  • System.Classes.InitInheritedComponent
  • FMX.Forms.TCommonCustomForm.Create
  • FMX.Forms.TCustomForm.Create
  • FMX.Forms.TCustomForm.TCustomForm
  • FMX.Forms.TApplication.RealCreateForms
  • FMX.Platform.Win.TPlatformWin.Run
  • FMX.Forms.TApplication.Run
  • 22 авг 16, 21:07    [19575638]     Ответить | Цитировать Сообщить модератору
     Re: Грабли с FastMM + bds.exe  [new]
    Cobalt747
    Member

    Откуда:
    Сообщений: 2131
    GunSmoker,

    Есть багрепорт, за который можно проголосовать?
    23 авг 16, 10:02    [19577045]     Ответить | Цитировать Сообщить модератору
     Re: Грабли с FastMM + bds.exe  [new]
    GunSmoker
    Member

    Откуда:
    Сообщений: 3110
    Это не то чтобы прям баг - просто чудеса дизайна.
    23 авг 16, 13:46    [19578626]     Ответить | Цитировать Сообщить модератору
     Re: Грабли с FastMM + bds.exe  [new]
    O'rioch
    Guest
    Kazantsev Alexey
    Если менеджер памяти не использует sysutils


    Гы! вроде и без SysUtils смогли грохнуть - https://github.com/pleriche/FastMM4/issues/18
    24 авг 16, 22:21    [19586818]     Ответить | Цитировать Сообщить модератору
     Re: Грабли с FastMM + bds.exe  [new]
    Kazantsev Alexey
    Member

    Откуда:
    Сообщений: 3919
    O'rioch
    Гы! вроде и без SysUtils смогли грохнуть - https://github.com/pleriche/FastMM4/issues/18

    А поддержка мониторов инициализируется в... sysutils :)
    24 авг 16, 23:03    [19586960]     Ответить | Цитировать Сообщить модератору
     Re: Грабли с FastMM + bds.exe  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 11075
    Kazantsev Alexey,

    ммммда

    интересно, сколько же сил тогда ушло у KOL'овцев , чтобы переписать RTL на модулной основе без спагетти-зависимостей?
    25 авг 16, 12:41    [19588806]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Delphi Ответить