mORMot2 DailyLecture quotidienne des commits upstream

L’historique des exceptions est reconstruit et OpenSSL reçoit un nouveau correctif I/O

Le chemin d’interception des exceptions est largement reconstruit après l’identification d’un GPF aléatoire et d’un modèle mémoire/threading non sûr dans l’ancien stockage des dernières exceptions. La séquence se termine par une récupération newest-first correcte et une stack bornée par exception. Les retries Send/Receive et le reporting des erreurs de configuration OpenSSL reçoivent deux correctifs finaux, tandis que FPC gagne une meilleure capture de stack et une réparation du seed déterministe ARM32.

En bref

  • Visez la build 2.4.17082 au commit 03ab5c85c4b2982c96b7f38d683dbff85e016f77.
  • GetLastException et GetLastExceptions utilisent un ring verrouillé de 16 entrées avec une copie privée de stack par exception.
  • OpenSSL ne retente que WANT_READ/WANT_WRITE, impose cinq secondes et rapporte les erreurs de setup sans détourner SSL_get_error.
  • La méthode de classe publique TDebugFile.AddLog est supprimée ; les appelants doivent migrer vers les API de location ou StackTrace restantes.
  • KEEP_STACKFRAMES conserve les réglages de stack frames du projet, surtout pour le debug FPC POSIX, avec un coût de performance documenté.
  • FPC Windows consomme la stack capturée par le RTL et FPC ARM32 stabilise le QWord de TLecuyer.SeedGenerator.

Conseil de mise à jour

Visez la build 2.4.17082. Mettez à niveau rapidement si la production utilise l’interception d’exceptions, GetLastException/GetLastExceptions ou des sockets OpenSSL asynchrones ; testez les rafales concurrentes, les limites Depth newest-first, les erreurs certificat/setup et les transitions WANT opposées. Recherchez TDebugFile.AddLog, dont la méthode de classe publique est supprimée. N’activez KEEP_STACKFRAMES que si le diagnostic FPC POSIX justifie son coût. Aucun superseded_by n’étaye une plage à éviter.

Build2.4.17065 → 2.4.17082
Commits17
Lignes+498 -536
Lecture5 min

17 sur 17 entrées · 17 commits upstream

Sujets
# Entrée Catégorie Unités
1 Élevée Le stockage des dernières exceptions est reconstruit pour supprimer un GPF aléatoire mormot.core.log remplace l’ancien stack/index partagé par un ring de 16 slots protégé par TLightLock. Chaque TSynLogExceptionInfo possède jusqu’à 16 adresses filtrées, efface EInstance/EStack et copie Message tant que l’exception est valide. Correctifs mormot.core.log 8298b7c1+143-124

core: rewritten last exception in-memory storage

Impact

L’interception concurrente n’expose plus la stack d’une exception via un stockage partagé mutable et ne conserve plus une instance invalide. Upstream attribue à l’ancien modèle un GPF aléatoire et un comportement mémoire/threading non sûr.

API publique

  • TSynLogStackTraceadded — Un tableau fixe public stocke jusqu’à MAX_STACK_TRACE adresses filtrées par exception.
  • TSynLogExceptionInfo.StackTraceadded — Chaque entrée d’exception retournée possède désormais sa copie des adresses de stack.
  • PSynLogExceptionInfoadded — Un alias pointer public pour TSynLogExceptionInfo est introduit.

Arnaud Bouchez · 17:23 UTC · voir le commit sur GitHub →

2 Élevée Les logs d’exception disque réutilisent la stack copiée en sécurité SynLogException écrit désormais les frames filtrées pré-calculées avant la copie dans le ring, au lieu de résoudre une seconde stack dans le writer disque. Le try/except imbriqué est simplifié et le lock reste protégé par finally. Correctifs mormot.core.log ff2fda39+46-67

core: rewritten exception logging code

Impact

L’historique mémoire et la ligne disque décrivent la même call stack, et la résolution ne s’exécute plus deux fois dans le contexte instable. Upstream indique que cela évite l’essentiel de l’instabilité.

Arnaud Bouchez · 17:24 UTC · voir le commit sur GitHub →

3 Élevée La récupération renvoie le bon slot et respecte depth en newest-first GetLastException lit Infos[Next - 1] en transformant zéro en longueur du tableau. GetLastExceptions parcourt depuis Next vers l’arrière, s’arrête aux entrées vides, applique Depth aux plus récentes et renvoie latest-first. Correctifs mormot.core.log efe676a8+28-36

core: GetLastException/GetLastExceptions fixes

Impact

Les consommateurs ne reçoivent plus le prochain slot non écrit comme dernière exception et Depth ne sélectionne plus le mauvais côté du ring. Le fallback manuel est aussi limité explicitement à WIN32DELPHI.

Arnaud Bouchez · 18:18 UTC · voir le commit sur GitHub →

4 Élevée Les erreurs de setup OpenSSL ne consultent plus l’API d’erreur I/O L’ancien TOpenSslNetTls.Check devient CheckRes et passe nil au lieu de fSsl à CheckFailed pour les codes context/setup. Les vérifications certificat, clé, cipher, hostname et set_fd l’utilisent ; l’absence de peer certificate lève un message direct. Correctifs mormot.lib.openssl11 03ab5c85+21-20

lib: introducing TOpenSslNetTls.CheckRes

Impact

Les erreurs de configuration et certificat rapportent le contexte du code qui a réellement échoué au lieu de dériver un SSL_get_error sans rapport depuis l’objet SSL. C’est le head final de la séquence OpenSSL.

Arnaud Bouchez · 19:48 UTC · voir le commit sur GitHub →

5 Élevée Les retries OpenSSL rejettent immédiatement les erreurs non-WANT WaitRetry devient membre de TOpenSslNetTls, mappe seulement SSL_ERROR_WANT_READ/WRITE vers les événements socket, lève CheckFailed pour toute autre erreur et conserve la limite de cinq secondes. CheckProc, Receive et Send lui passent le résultat SSL réel. Correctifs mormot.lib.openssl11 f3b1fe74+18-16

lib: another fixed to TOpenSslNetTls.Send/Receive

Impact

Les erreurs TLS fatales ne sont plus traitées comme de simples attentes de disponibilité socket et les transitions WANT opposées restent bornées. Les échecs remontent plus vite leur véritable erreur OpenSSL.

Arnaud Bouchez · 19:33 UTC · voir le commit sur GitHub →

6 Moyenne TDebugFile.AddLog public est supprimé lors de la consolidation des symboles La class function statique publique TDebugFile.AddLog est supprimée. L’ancien AppendLog protected devient un AddLog d’instance interne, ajoute des gardes nil/adresse et filtre plus de frames d’interception. Ruptures mormot.core.log aa3f2ade+25-28

core: rewritten TDebugFile.AddLog method

Impact

Le code applicatif appelant TDebugFile.AddLog ne compile plus. Le logging interne conserve le comportement writer via l’instance TDebugFile en cache.

Migration nécessaire

Recherchez TDebugFile.AddLog. Utilisez FindLocationShort ou FindLocation pour une adresse, ou un overload StackTrace pour une call stack, puis ajoutez ce texte à votre writer.

API publique

  • TDebugFile.AddLogremoved — Le helper writer statique public n’est plus exposé.

Arnaud Bouchez · 17:20 UTC · voir le commit sur GitHub →

7 Moyenne Le chargement des symboles courants devient une initialisation atomique unique TDebugFile.CurrentDebugFile remplace le test nil/sentinel par DebugFileCurrentSearched.TryLock et ne résout DebugFileRegister qu’une fois. Les appels suivants lisent le pointer aligné atomiquement. Correctifs mormot.core.log b619f4a2+9-14

core: atomic TDebugFile.CurrentDebugFile initialization

Impact

Les premiers appels concurrents ne lancent plus plusieurs découvertes du debug file courant. Le comportement public reste un TDebugFile ou nil si les symboles sont absents.

Arnaud Bouchez · 17:13 UTC · voir le commit sur GitHub →

8 Moyenne L’interception d’exceptions évite la family en cours de désactivation SearchHandleException reçoit un pointer à ignorer et TSynLogFamily.SetLevel lui passe self lors du choix d’une family de remplacement. TSynLogThreads.Safe reste premier et Count précède les tableaux managed pour l’alignement AArch64. Correctifs mormot.core.log 0043300f+12-7

core: refined exception interception initialization

Impact

Désactiver l’interception sur la family active peut désormais la transférer à une autre family active au lieu de resélectionner celle qui se désactive. Le lock reste aligné sur AArch64.

Arnaud Bouchez · 17:24 UTC · voir le commit sur GitHub →

9 Moyenne KEEP_STACKFRAMES conserve les réglages de stack frames du projet mormot.defines.inc déclare KEEP_STACKFRAMES et ne force plus {$W-} lorsqu’il est défini. Les sections d’interception et de stack trace dans mormot.core.log et mormot.core.os conservent aussi le réglage du projet. Nouveautés mormot.defines+3 bab77b73+48-12

core: introducing new KEEP_STACKFRAMES conditional

Impact

Les builds FPC POSIX peuvent conserver les stack frames sans données d’unwind et améliorer le diagnostic. L’option est désactivée par défaut, déconseillée sous Delphi Win32 et coûte en performances.

À regarder

Activez KEEP_STACKFRAMES seulement sur les cibles qui nécessitent ces diagnostics, puis mesurez les hot paths et la qualité des frames.

API publique

  • KEEP_STACKFRAMESadded — Un conditional de compilation public conserve le réglage de génération des stack frames du projet.

Arnaud Bouchez · 17:08 UTC · voir le commit sur GitHub →

10 Moyenne Les exceptions FPC Windows conservent la call stack capturée par le RTL Le handler Windows LogExcept lit les paramètres FPC 2 et 3 quand le nombre de frames est inférieur à 63, puis place pointer et count RTL dans TSynLogExceptionContext. L’interception imbriquée est coupée avant la construction du contexte. Compilateur & plateforme mormot.core.os.windows 134e87da+45-33

core: include the stack trace captured by FPC RTL

Impact

Les logs d’exception FPC Windows utilisent la stack capturée au point exact du raise au lieu de la reconstruire plus tard. Le pointer n’est valide que dans le handler et sera copié par les commits suivants.

Arnaud Bouchez · 17:09 UTC · voir le commit sur GitHub →

11 Moyenne Le seed déterministe FPC ARM32 utilise un QWord local stable mormot.core.base copie l’argument QWord de TLecuyer.SeedGenerator dans un tmp local avant de transmettre son adresse à l’overload pointer. Le commit fait aussi hériter ESChannel et ESynLabeledEdit de ExceptionWithProps. Compilateur & plateforme mormot.core.base+2 039b0ff8+8-5

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

Impact

FPC ARM32 ne dépend plus de l’adressabilité d’un paramètre 64-bit passé par valeur pour produire les séquences déterministes. Les handlers restent compatibles et les deux exceptions gagnent le comportement property-aware hérité.

API publique

  • ESChannelbehaviour-changed — La classe d’exception publique descend désormais de ExceptionWithProps au lieu de Exception.
  • ESynLabeledEditbehaviour-changed — La classe d’exception UI publique descend maintenant de ExceptionWithProps.

Arnaud Bouchez · 06:48 UTC · voir le commit sur GitHub →

12 Moyenne Les overloads StackTrace partagent un seul chemin de capture et de symboles TDebugFile.AppendCallerShort capture RawStackTrace puis délègue à AppendLocationsShort. L’overload writer résout CurrentDebugFile une fois et TSynLog.AddStackTrace l’utilise pour toutes les branches compiler. Sous le capotinterp mormot.core.log f661c29c+32-126

core: refactored TDebugFile.StackTrace overloaded methods

Impact

Le formatage suit une implémentation commune sous Delphi et FPC, réduisant les divergences de filtrage. Les signatures restent identiques, mais la liste exacte des frames peut changer.

À regarder

Si un outil parse les stacks symbolisées, comparez des logs Delphi et FPC représentatifs après mise à niveau.

Arnaud Bouchez · 17:24 UTC · voir le commit sur GitHub →

13 Faible Le stack walk manuel Delphi Win32 supprime les adresses dupliquées ManualStackTrace appelle désormais IntegerScanExists avant d’accepter une adresse de retour, évitant les doublons. Le sujet upstream précise que beaucoup de faux positifs subsistent. Correctifs mormot.core.log 307fb2df+4-3

core: small Delphi Win32 stack trace cleanup

Impact

Les traces fallback Delphi Win32 contiennent moins de doublons, mais leur sortie heuristique ne doit pas être considérée comme totalement fiable.

Arnaud Bouchez · 17:21 UTC · voir le commit sur GitHub →

14 Faible Les tableaux de frames gagnent un formateur de symboles courts borné TDebugFile.AppendLocationsShort accepte PPtrUIntArray, count et depth, ignore les adresses adjacentes dupliquées et ajoute les symboles résolus jusqu’au remplissage du ShortString. Nouveautés mormot.core.log 7c45e354+26-29

core: new TDebugFile.AppendLocationsShort method

Impact

Les appelants disposant déjà d’un tableau de frames peuvent le formater sans recapturer la stack ni allouer de managed string.

API publique

  • TDebugFile.AppendLocationsShortadded — Un formateur public borné pour tableaux d’adresses capturées est disponible.

Arnaud Bouchez · 17:20 UTC · voir le commit sur GitHub →

15 Faible Les timestamps Unix gagnent un formateur ISO date-heure à taille fixe mormot.core.datetime ajoute UnixTimeToShort. La fonction convertit TUnixTime via TSynSystemTime.FromUnixTime et produit un TShort31 avec ToIsoDateTimeShort ; FirstTimeChar vaut espace par défaut. Nouveautés mormot.core.datetime 9e8264b4+13-2

core: new UnixTimeToShort() wrapper function

Impact

Les appelants peuvent formater un epoch en texte ISO compact sans allouer de managed string. Les helpers existants ne changent pas.

API publique

  • UnixTimeToShortadded — Un formateur public TUnixTime vers TShort31 avec FirstTimeChar configurable est disponible.

Arnaud Bouchez · 17:06 UTC · voir le commit sur GitHub →

16 Faible Le cache d’informations système cesse de partager le verrou OS global mormot.core.os ajoute _SysInfoSafe autour du cache RetrieveSysInfo d’une seconde au lieu de OSSafe. Le commentaire POSIX précise que le chemin utilise le cache ou un seul syscall. Performance mormot.core.os+2 f8d9a295+9-8

core: tuned RetrieveSysInfo() locking

Impact

Les lectures fréquentes d’informations système ne contendront plus avec les autres utilisateurs de OSSafe. Les valeurs et l’intervalle d’une seconde restent inchangés.

Arnaud Bouchez · 06:49 UTC · voir le commit sur GitHub →

17 Faible Le benchmark numérique détecte les dépassements avant la copie BenchmarkNumbers mémorise la limite, vérifie p + length avant MoveFast, calcule une fois le hash du buffer et l’inclut dans les assertions de parsing suivantes. Tests test.core.base cd7fa5b7+11-6

tests: completed BenchmarkNumbers tests

Impact

Le code de production ne change pas. Le test numérique lent échoue désormais sans overflow et rapporte une preuve déterministe si TLecuyer diverge.

Arnaud Bouchez · 06:50 UTC · voir le commit sur GitHub →

Activité upstream commits par jour · 60 derniers jours
Commits977
Jours actifs44/60
Plus chargé2026-09-30
Pic60
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