mORMot2 DailyЕжедневный обзор коммитов апстрима

История исключений переписана, OpenSSL получил ещё одно I/O-исправление

Путь перехвата исключений существенно переписан после обнаружения случайного GPF и небезопасной memory/threading-модели в прежнем хранилище последних исключений. Финальная версия исправляет newest-first выдачу и хранит ограниченный stack для каждого исключения. OpenSSL получает два завершающих исправления Send/Receive retry и setup errors, а FPC — улучшенный stack capture и починку deterministic seed на ARM32.

Коротко

  • Переходите на build 2.4.17082 в 03ab5c85c4b2982c96b7f38d683dbff85e016f77.
  • GetLastException и GetLastExceptions используют защищённое кольцо из 16 записей с отдельной копией stack для каждого исключения.
  • OpenSSL повторяет только WANT_READ/WANT_WRITE, ограничивает ожидание пятью секундами и не применяет SSL_get_error к setup failures.
  • Публичный class method TDebugFile.AddLog удалён; внешние вызовы нужно перевести на оставшиеся location или StackTrace API.
  • KEEP_STACKFRAMES сохраняет project stack-frame settings, главным образом для FPC POSIX debugging, с документированной потерей производительности.
  • FPC Windows использует захваченный RTL exception stack, а FPC ARM32 получает стабильное QWord-хранилище для TLecuyer.SeedGenerator.

Рекомендации по обновлению

Переходите на build 2.4.17082. Обновляйтесь быстрее при exception interception, GetLastException/GetLastExceptions или async OpenSSL sockets; проверьте конкурентные всплески, newest-first Depth, certificate/setup failures и противоположные WANT transitions. Найдите вызовы TDebugFile.AddLog: публичный class method удалён. Включайте KEEP_STACKFRAMES только если FPC POSIX diagnostics оправдывает стоимость. В raw payload нет superseded_by, поэтому avoid window не заявляется.

Сборка2.4.17065 → 2.4.17082
Коммиты17
Строки+498 -536
Чтение4 мин

17 из 17 записей · 17 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Высокий Хранилище последних исключений переписано для устранения случайного GPF mormot.core.log заменяет общий stack/index на кольцо из 16 слотов под TLightLock. Каждый TSynLogExceptionInfo хранит до 16 отфильтрованных адресов, очищает EInstance/EStack и копирует Message, пока исключение действительно. Исправления mormot.core.log 8298b7c1+143-124

core: rewritten last exception in-memory storage

Влияние

Конкурентный перехват больше не делит изменяемый stack между исключениями и не сохраняет недействительный instance. Upstream связывает прежнюю модель со случайным GPF и небезопасным memory/threading behavior.

Публичный API

  • TSynLogStackTraceadded — Публичный фиксированный массив хранит до MAX_STACK_TRACE адресов на исключение.
  • TSynLogExceptionInfo.StackTraceadded — Каждая возвращаемая запись исключения теперь содержит собственную копию stack addresses.
  • PSynLogExceptionInfoadded — Добавлен публичный pointer alias для TSynLogExceptionInfo.

Модули

Arnaud Bouchez · 17:23 UTC · открыть коммит на GitHub →

2 Высокий Дисковые exception logs используют безопасно скопированный history stack SynLogException пишет заранее вычисленные frames до копирования в history ring, а не разрешает второй stack внутри file writer. Вложенный try/except упрощён, writer lock по-прежнему освобождается в finally. Исправления mormot.core.log ff2fda39+46-67

core: rewritten exception logging code

Влияние

История в памяти и строка на диске описывают один stack; symbol lookup не выполняется дважды в нестабильном exception context. Upstream указывает, что это устраняет большую часть нестабильности.

Модули

Arnaud Bouchez · 17:24 UTC · открыть коммит на GitHub →

3 Высокий Получение последних исключений исправляет slot и newest-first depth GetLastException читает Infos[Next - 1], заменяя ноль длиной массива. GetLastExceptions идёт назад от Next, останавливается на пустых слотах, применяет Depth к новым записям и возвращает latest-first. Исправления mormot.core.log efe676a8+28-36

core: GetLastException/GetLastExceptions fixes

Влияние

Потребители больше не получают следующий пустой slot как последнее исключение, а Depth выбирает правильную сторону кольца. Ручной fallback явно ограничен WIN32DELPHI.

Модули

Arnaud Bouchez · 18:18 UTC · открыть коммит на GitHub →

4 Высокий OpenSSL setup failures больше не используют I/O error API Прежний TOpenSslNetTls.Check переименован в CheckRes и передаёт nil вместо fSsl в CheckFailed для context/setup results. Его используют certificate, key, cipher, hostname и set_fd checks; отсутствие peer certificate вызывает прямой EOpenSslNetTls. Исправления mormot.lib.openssl11 03ab5c85+21-20

lib: introducing TOpenSslNetTls.CheckRes

Влияние

Ошибки конфигурации и сертификата сообщают контекст реально сбойного return code, а не посторонний SSL_get_error от активного SSL object. Это финальный head OpenSSL-серии.

Arnaud Bouchez · 19:48 UTC · открыть коммит на GitHub →

5 Высокий OpenSSL retry немедленно отклоняет ошибки не-WANT WaitRetry стал методом TOpenSslNetTls, отображает только SSL_ERROR_WANT_READ/WRITE на соответствующие socket events, для остальных вызывает CheckFailed и сохраняет пятисекундный deadline. CheckProc, Receive и Send передают реальный SSL result. Исправления mormot.lib.openssl11 f3b1fe74+18-16

lib: another fixed to TOpenSslNetTls.Send/Receive

Влияние

Фатальные TLS errors больше не превращаются в ожидание socket readiness, а противоположные WANT transitions остаются ограниченными. Реальная OpenSSL error появляется раньше.

Arnaud Bouchez · 19:33 UTC · открыть коммит на GitHub →

6 Средний Публичный TDebugFile.AddLog удалён при объединении symbol writer Публичная static class function TDebugFile.AddLog удалена. Прежний protected AppendLog стал внутренним instance AddLog, получил проверки nil/адреса и фильтрацию interception frames. Несовместимые изменения mormot.core.log aa3f2ade+25-28

core: rewritten TDebugFile.AddLog method

Влияние

Код с вызовом TDebugFile.AddLog больше не компилируется. Внутренний stack logging сохраняет writer behavior через кэшированный TDebugFile instance.

Требуется миграция

Найдите TDebugFile.AddLog. Для одного адреса используйте FindLocationShort/FindLocation, для call stack — StackTrace overload, затем добавьте текст в writer.

Публичный API

  • TDebugFile.AddLogremoved — Публичный static writer helper больше не доступен.

Модули

Arnaud Bouchez · 17:20 UTC · открыть коммит на GitHub →

7 Средний Загрузка текущих debug symbols стала однократной атомарной инициализацией TDebugFile.CurrentDebugFile заменяет nil/sentinel-проверку на DebugFileCurrentSearched.TryLock и разрешает DebugFileRegister один раз. Последующие вызовы атомарно читают выровненный pointer. Исправления mormot.core.log b619f4a2+9-14

core: atomic TDebugFile.CurrentDebugFile initialization

Влияние

Конкурентный первый вызов больше не запускает повторный поиск debug file. Публичный результат остаётся TDebugFile или nil при отсутствии символов.

Модули

Arnaud Bouchez · 17:13 UTC · открыть коммит на GitHub →

8 Средний Exception interception пропускает отключаемую family SearchHandleException получает ignore pointer, а TSynLogFamily.SetLevel передаёт self при выборе replacement family. TSynLogThreads.Safe остаётся первым, Count перемещён перед managed arrays для AArch64 alignment. Исправления mormot.core.log 0043300f+12-7

core: refined exception interception initialization

Влияние

При отключении активной log family перехват передаётся другой включённой family, а не выбирает отключаемую снова. Выравнивание lock на AArch64 сохранено.

Модули

Arnaud Bouchez · 17:24 UTC · открыть коммит на GitHub →

9 Средний KEEP_STACKFRAMES сохраняет project stack-frame settings mormot.defines.inc объявляет KEEP_STACKFRAMES и не форсирует {$W-}, когда символ задан. Секции exception interception и stack trace в mormot.core.log/mormot.core.os также сохраняют настройку проекта. Новые возможности mormot.defines+3 bab77b73+48-12

core: introducing new KEEP_STACKFRAMES conditional

Влияние

FPC POSIX builds могут сохранять stack frames при отсутствии unwinding data. Опция выключена по умолчанию, не рекомендована для Delphi Win32 и имеет измеримую стоимость.

Стоит взглянуть

Включайте KEEP_STACKFRAMES только для целей, которым нужна диагностика, затем измерьте hot paths и качество frames.

Публичный API

  • KEEP_STACKFRAMESadded — Новый публичный compile-time conditional сохраняет настройку генерации stack frames проекта.

Arnaud Bouchez · 17:08 UTC · открыть коммит на GitHub →

10 Средний Исключения FPC Windows сохраняют call stack, захваченный RTL Windows LogExcept читает параметры FPC 2 и 3 при числе frames меньше 63 и помещает RTL stack pointer/count в TSynLogExceptionContext. Nested interception отключается до построения контекста и восстанавливается после. Компилятор и платформы mormot.core.os.windows 134e87da+45-33

core: include the stack trace captured by FPC RTL

Влияние

Логи FPC Windows используют stack из точного места raise, а не восстанавливают его позже. Pointer действителен только внутри handler и копируется последующими commits этой редакции.

Arnaud Bouchez · 17:09 UTC · открыть коммит на GitHub →

11 Средний Deterministic seed на FPC ARM32 использует стабильный локальный QWord mormot.core.base копирует QWord-параметр TLecuyer.SeedGenerator в локальный tmp перед передачей адреса pointer overload. В том же commit ESChannel и ESynLabeledEdit переведены на ExceptionWithProps. Компилятор и платформы mormot.core.base+2 039b0ff8+8-5

core: try to fix FPC arm32 TLecuyer.Seed()

Влияние

FPC ARM32 больше не зависит от адресуемости 64-bit параметра по значению при deterministic sequences. Существующие handlers совместимы, а два класса получают наследуемое property-aware поведение.

Публичный API

  • ESChannelbehaviour-changed — Публичный класс исключения теперь наследует ExceptionWithProps вместо Exception.
  • ESynLabeledEditbehaviour-changed — Публичный UI-класс исключения теперь наследует ExceptionWithProps.

Arnaud Bouchez · 06:48 UTC · открыть коммит на GitHub →

12 Средний Overloads StackTrace используют общий путь захвата frames и символов TDebugFile.AppendCallerShort захватывает RawStackTrace и передаёт его AppendLocationsShort. Writer overload один раз получает CurrentDebugFile, а TSynLog.AddStackTrace использует его для всех compiler branches. Внутреннее устройствоinterp mormot.core.log f661c29c+32-126

core: refactored TDebugFile.StackTrace overloaded methods

Влияние

Форматирование stack унифицировано для Delphi/FPC. Сигнатуры не меняются, но точный список frames после объединения может отличаться.

Стоит взглянуть

Если tooling разбирает symbolized stack text, сравните типичные логи Delphi и FPC после обновления.

Модули

Arnaud Bouchez · 17:24 UTC · открыть коммит на GitHub →

13 Низкий Ручной stack walk Delphi Win32 удаляет повторяющиеся адреса ManualStackTrace вызывает IntegerScanExists перед принятием return address и не выдаёт дубликаты. Upstream прямо отмечает, что false positives всё ещё многочисленны. Исправления mormot.core.log 307fb2df+4-3

core: small Delphi Win32 stack trace cleanup

Влияние

Fallback traces Delphi Win32 содержат меньше дубликатов, но эвристический результат всё ещё не полностью надёжен.

Модули

Arnaud Bouchez · 17:21 UTC · открыть коммит на GitHub →

14 Низкий Массивы raw frames получили ограниченный formatter коротких символов TDebugFile.AppendLocationsShort принимает PPtrUIntArray, count и depth, пропускает соседние дубликаты и добавляет разрешённые символы до заполнения ShortString. Новые возможности mormot.core.log 7c45e354+26-29

core: new TDebugFile.AppendLocationsShort method

Влияние

Готовый массив frames можно форматировать без повторного захвата stack и без managed string.

Публичный API

  • TDebugFile.AppendLocationsShortadded — Добавлен публичный ограниченный formatter массивов захваченных адресов.

Модули

Arnaud Bouchez · 17:20 UTC · открыть коммит на GitHub →

15 Низкий Unix timestamps получили formatter ISO date-time фиксированного размера mormot.core.datetime добавляет UnixTimeToShort. TUnixTime преобразуется через TSynSystemTime.FromUnixTime в TShort31 методом ToIsoDateTimeShort; FirstTimeChar по умолчанию равен пробелу. Новые возможности mormot.core.datetime 9e8264b4+13-2

core: new UnixTimeToShort() wrapper function

Влияние

Можно форматировать epoch в компактный ISO date-time без managed string. Существующие date helpers не меняются.

Публичный API

  • UnixTimeToShortadded — Добавлен публичный formatter TUnixTime-to-TShort31 с настраиваемым FirstTimeChar.

Arnaud Bouchez · 17:06 UTC · открыть коммит на GitHub →

16 Низкий Кэш системной информации больше не использует общую OS-блокировку mormot.core.os добавляет _SysInfoSafe для секундного RetrieveSysInfo cache вместо OSSafe. POSIX-комментарий уточняет: используется кэш или один syscall. Производительность mormot.core.os+2 f8d9a295+9-8

core: tuned RetrieveSysInfo() locking

Влияние

Частое логирование системной информации больше не конкурирует с другими пользователями OSSafe. Результаты и секундный интервал не меняются.

Arnaud Bouchez · 06:49 UTC · открыть коммит на GitHub →

17 Низкий Числовой benchmark проверяет выход generator за буфер до копирования BenchmarkNumbers сохраняет границу, проверяет p + length до MoveFast, один раз считает hash буфера и включает его в последующие parsing assertions. Тесты test.core.base cd7fa5b7+11-6

tests: completed BenchmarkNumbers tests

Влияние

Production code не изменён. Медленный числовой тест безопасно завершается и сообщает deterministic evidence при неожиданном распределении TLecuyer.

Модули

Arnaud Bouchez · 06:50 UTC · открыть коммит на GitHub →

Активность апстрима коммитов в день · последние 60 дней
Коммиты977
Активных дней44/60
Пик активности2026-09-30
Максимум60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13