Agir maintenantpeut affecter un système en productionLes 17 commits non-merge de 2.4.17066 à 2.4.17082 ont été examinés : 498 ajouts et 536 suppressions. Les changements de version seuls dans mormot.commit.inc et mormot.commit-num.inc sont ignorés. Aucun commit ne porte superseded_by ; l’ordre vient des follow-ups du même unit inspectés directement et ne crée pas de plage à éviter.
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.
17 sur 17 entrées · 17 commits upstream
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.
Mise à jour recommandée
Les services avec interception d’exceptions doivent aller jusqu’à 2.4.17080 et stresser les exceptions concurrentes ainsi que les lecteurs GetLastException/GetLastExceptions.
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.
Unités
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é.
Mise à jour recommandée
Mettez les services riches en exceptions à niveau jusqu’à 2.4.17080 et comparez la trace disque à GetLastExceptionText sous erreurs concurrentes.
Unités
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.
Mise à jour recommandée
Prenez ce correctif final et testez Depth à 1, à la taille du ring et au-delà sous production concurrente d’exceptions.
Unités
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.
Mise à jour recommandée
Visez cette build et vérifiez que certificats invalides ou absents, mauvaises clés, ciphers et hostname validation produisent des erreurs exploitables.
Unités
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.
Mise à jour recommandée
Passez à 2.4.17082 et testez SSL_connect, SSL_accept, Send et Receive avec WANT_READ, WANT_WRITE, timeout et erreur terminale.
Unités
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é.
Unités
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.
Mise à jour recommandée
Mettez à niveau les services de log susceptibles d’initialiser les symboles en concurrence au démarrage ou pendant une rafale d’exceptions.
Unités
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.
Mise à jour recommandée
Les applications avec plusieurs TSynLogFamily doivent tester l’activation et la désactivation de HandleExceptions pendant des exceptions.
Unités
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.
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.
Mise à jour recommandée
Les services FPC Windows dépendant des stacks d’exception doivent prendre toute la séquence jusqu’à 2.4.17080 et comparer les frames symbolisées.
Unités
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é.
Mise à jour recommandée
Les utilisateurs FPC ARM32 doivent recompiler et comparer la sortie TLecuyer.SeedGenerator avec une autre cible prise en charge.
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.
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
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.