Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218

Пытаюсь подсунуть FastMM4 вместо BorlndMM - ошибка

25.03.2019, 16:24. Показов 4583. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, коллективный разум! Нужна помощь...

Есть одна противная программа, жутко проприетарная и тормозная. Хочу подсунуть ей кастомный менеджер памяти, чтоб хоть как-то ускорить.

Прога на Delphi5, сорцов естественно нет. Я заменяю ей BorlndMM.dll на FastMM4-AVX, но первое же обращение к SysGetMem(24) приводит к AccessViolation внутри самой SysGetMem на 14-м шаге. На скриншоте видно, что в EDX - ноль...

Может, я чего-то не так делаю? Может, программа должна вызвать какую-то процедуру инициализации, прежде чем работать с этой библиотекой? Пробовал разные версии и форки, пробовал компилировать под D5, D7 - не помогает...
Миниатюры
Пытаюсь подсунуть FastMM4 вместо BorlndMM - ошибка  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.03.2019, 16:24
Ответы с готовыми решениями:

borlndmm.dll 6-ой версии - ошибка ?
Есть некоторый софт, работает с использованием borlndmm.dll При использовании функции FreeLibrary возникает ошибка обращения к памяти по...

Как подсунуть парсеру для разбора строку вместо файла?
Я пытался сделать это так: try { XMLReader parser =...

Можно ли "подсунуть" Excel-ю байтовый массив вместо файла?
Есть таблица в базе данных SQL, в ней бинарное поле. В поле сидит Excel-файл - нужно его загрузить в Excel. Задача решается так: 1)через...

26
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
29.03.2019, 14:45
Студворк — интернет-сервис помощи студентам
Может оставить 2 менеджера памяти - для bpl стандартный BorlndMM.dll, а в таблице импорта поправить имя dll на FastMM.dll? Или будет конфликт?
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
29.03.2019, 17:44  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
поправить имя dll
Оу, йес. Думал эту мыслю, пока шёл с работы. В понедельник попробую следующее:

1) Оставить либу, скомпилированную автором FastMM. Без патчей.
2) Написать заглушку, проксирующую вызовы к ней через себя, дать ей имя BorlndXX.dll
3) Первый модуль в секции импорта - RxCtl5.dll, заменить в нём блокнотом BorlndMM на BorlndXX.
4) В BorlndXX при вызове любой функции дёргать сначала код инициализации BorlndMM.

RxCtl5 - это визуальные компоненты, они не сильно требовательны к памяти. В отличие от следующих BPL, в которых лютая математика. Его вызовы будут идти через заглушку, а остальные - напрямую в либу без потери скорости.

Осталось нагуглить, как узнать адрес EntryPoint, имея hmodule. Т.к. процедура инициализации не экспортируется. Но это решаемо, думаю.
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
01.04.2019, 15:57  [ТС]
После замены BorlndMM на BorlndXX в RxCtl5.bpl (автозаменой) последний перестал дёргать SysGetMem на этапе инициализации. Теперь следующий за ним BPL дёргает (и падает). Перспектива патчить все BPL мне не нравится...

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int _RTLENTRY __CRTL_MEM_CheckBorMem (void)
{
    mmdll = GetModuleHandle(BORLNDMM);
...
    if (!(_bormm_pfn_HeapAddRef && _bormm_pfn_HeapRelease))
    {
        _heap_redirector.free      = _internal_free;
        _heap_redirector.malloc    = _internal_malloc;
        _heap_redirector.realloc   = _internal_realloc;
        _heap_redirector.terminate = _internal_free_heaps;
        _heap_redirector.flags     = _hrf_old_borlndmm;
        return 1;
    }
...
}
Условие никогда не выполняется. Идея такая: убираем этот мусор и вставляем туда принудительный вызов процедуры инициализации. ImageBase модуля есть в mmdll, DllMain и RunInitializationCode не экспортируются, но для конкретной сборки FastMM.dll их можно найти вручную (mmdll+70CC и mmdll+70AC соответственно).

Добавлено через 39 минут
Прописал. не получилось. Оригинальная FastMM4 падает ровно в том же месте, где и моя скомпилированная в режиме ассемблера версия:

Delphi
1
LPMediumBlockPoolHeader := MediumBlockPoolsCircularList.NextMediumBlockPoolHeader;
В LPMediumBlockPoolHeader попадает ноль, а не значение MediumBlockPoolsCircularList.

Добавлено через 16 минут
О, получилось, кажись.

1) Патч на fastmm.dll: вырезал проверку CheckCanInstallMemoryManager, которая вызывала FastGetHeapStatus, которая падала.
2) Патч на RxCtl5.bpl: принудительный вызов RunInitializationCode (CALL mmdll+70AC) сразу после LoadLibrary.

Программулина завелась

Сейчас оформлю красиво и замеры сделаю.

Добавлено через 19 минут


Работать с Olly вроде бы приятно, и в то же время подбешивает.. Вот сейчас забил кусок NOP-ами (0x90), сохраняю - каждый 8-й NOP заменился на 0x9D. Более того, пишу 70AC, а сохраняется 7DAC. Подумал, что я слепой, но нет - скриншот свидетель, я писал правильно...

Добавлено через 8 минут
И ещё такая фигня случается: Some fixups are only partially available. OllyDbg is unable to copy them to the executable file.

Сохранять отказывается. Что за фиксапы????.....
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
01.04.2019, 16:32
Цитата Сообщение от Postscripter Посмотреть сообщение
Что за фиксапы????
По другому это называется relocation table.
1
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
01.04.2019, 18:32  [ТС]
Аа.. Вот и чтение на ночь. А как они могут быть partially available, есть мысли?
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
02.04.2019, 03:35
Может когда ты патчил bpl ты затёр инструкции с абсолютными адресами, например "call 12345h", но релоки для этих инструкций остались и olly предупреждает, что их надо удалить.
1
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
02.04.2019, 14:40  [ТС]
Всё отлично, выкусил лишние релоки через RelocRebuilder.

Выводы:

- Ассемблерные сборки реально быстрее. По процентам сложно сказать - каждый usecase уникален. А вот разницы между форком AVX и ориг. FastMM я не заметил. Есть подозрения, что AVX-команды используются только в 64-битной версии библиотеки.

- Приложения, собранные с сишным модулем hrdir_b, некорректно инициализируют FastMM. Лечится тремя патчами:

1) В процедуре FastGetMem:

Assembler
1
2
3
4
  cmp InitializationCodeHasRun,0  // ACHTUNG!!!!   MINEN!!
  jnz @GoodToGo                   // BEWARE!!!!!!! HACK!!!   Line 7075
  call RunInitializationCode      //
  @GoodToGo:                      //
2) В инициализации: убрать проверку CheckCanInstallMemoryManager

3) И там же: заменить 'SwitchToThread' на LPCSTR-константу (совместимость с XE8)

Delphi
1
FSwitchToThread := GetProcAddress(GetModuleHandle(Kernel32), SwitchToThreadConst);
Сейчас утилизация процессора подопытным приложением 80%, график ровный. Думаю, есть ещё потенциал для оптимизации. Спасибо за поддержку, murderer
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2019, 14:40

Ошибка с BORLNDMM.Dll
Добрый день! При выполнении вот таких кусков кода возникает еррор "Access violation at adress 2155155 at module BORLNDMM.Dll! Write of...

Ошибка borlndmm.dll
access violation at address in module borlndmm.dll Ошибку такую выдаёт. Причём делает это два раза: первый раз при выполнении расчётов,...

Ошибка access violation at address in module borlndmm.dll write of address
Всем здравствуйте. Не могу побороть ошибку "access violation at address in module borlndmm.dll write of address ". Попробую объяснить....

Ошибка "borlndmm.dll"
Вообщем проблема такая. На работе стоит сервер win 2003, там критится сервер СБОН(система банковского обслуживания населения), субд MSSQL....

Delphi2007. Странное поведение FastMM4
Проблема с одним конкретным проектом. При подключенном FastMM4, после закрытия главного окна приложения процесс остается висеть в памяти,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru