Требует действийможет затронуть работающую системуПроверены все 17 non-merge commits от 2.4.17066 до 2.4.17082: 498 добавлений и 536 удалений. Чистые version changes в mormot.commit.inc и mormot.commit-num.inc игнорировались. superseded_by отсутствует; порядок основан на проверенных follow-ups в тех же units и не задаёт avoid range.
История исключений переписана, 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 не заявляется.
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.
Рекомендуется обновиться
Сервисам с exception interception следует обновиться до 2.4.17080 и нагрузить конкурентные исключения вместе с GetLastException/GetLastExceptions.
Публичный API
TSynLogStackTraceadded — Публичный фиксированный массив хранит до MAX_STACK_TRACE адресов на исключение.TSynLogExceptionInfo.StackTraceadded — Каждая возвращаемая запись исключения теперь содержит собственную копию stack addresses.PSynLogExceptionInfoadded — Добавлен публичный pointer alias для TSynLogExceptionInfo.
Модули
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 указывает, что это устраняет большую часть нестабильности.
Рекомендуется обновиться
Обновите exception-heavy services до 2.4.17080 и сравните disk trace с GetLastExceptionText при конкурентных ошибках.
Модули
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.
Рекомендуется обновиться
Возьмите это завершение history rewrite и проверьте Depth=1, размер кольца и большие значения при конкурентных исключениях.
Модули
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-серии.
Рекомендуется обновиться
Переходите на эту build и проверьте понятные ошибки для неверных/отсутствующих сертификатов, private keys, cipher config и hostname validation.
Модули
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 появляется раньше.
Рекомендуется обновиться
Обновитесь до 2.4.17082 и проверьте SSL_connect, SSL_accept, Send и Receive при WANT_READ, WANT_WRITE, timeout и terminal failure.
Модули
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 больше не доступен.
Модули
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 при отсутствии символов.
Рекомендуется обновиться
Обновите logging-heavy services, где symbol lookup может одновременно запускаться при старте или всплеске исключений.
Модули
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 сохранено.
Рекомендуется обновиться
Приложениям с несколькими TSynLogFamily следует проверить включение/отключение HandleExceptions во время исключений.
Модули
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 проекта.
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 этой редакции.
Рекомендуется обновиться
Сервисам FPC Windows, зависящим от exception stacks, следует взять всю серию до 2.4.17080 и сравнить symbolized frames.
Модули
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 поведение.
Рекомендуется обновиться
Пользователям FPC ARM32 следует пересобрать проект и сравнить TLecuyer.SeedGenerator с другой поддерживаемой целью.
Публичный API
ESChannelbehaviour-changed — Публичный класс исключения теперь наследует ExceptionWithProps вместо Exception.ESynLabeledEditbehaviour-changed — Публичный UI-класс исключения теперь наследует ExceptionWithProps.
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 после обновления.
Модули
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 содержат меньше дубликатов, но эвристический результат всё ещё не полностью надёжен.
Модули
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 массивов захваченных адресов.
Модули
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.
Модули
16
Низкий
Кэш системной информации больше не использует общую OS-блокировку
mormot.core.os добавляет _SysInfoSafe для секундного RetrieveSysInfo cache вместо OSSafe. POSIX-комментарий уточняет: используется кэш или один syscall.
Производительность
mormot.core.os+2
f8d9a295+9-8
core: tuned RetrieveSysInfo() locking
Влияние
Частое логирование системной информации больше не конкурирует с другими пользователями OSSafe. Результаты и секундный интервал не меняются.
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.